Python/PyQt/Qt 线程 : How do I print stdout/stderr right away?

标签 python multithreading qt

我在谷歌上搜索了一堆示例,并在 stackoverflow 上查看了一堆关于线程的问题,但我似乎仍然无法理解。

这是我正在使用的一些示例代码:

class Debugger(QTextBrowser):
    def __init__(self, parent):
        super(Debugger, self).__init__(parent)
        sys.stdout = self

    def write(self, text):
        self.moveCursor(QTextCursor.End)
        self.textCursor().insertText(text)

基本上,我试图捕获任何“打印”语句或其他形式的写入标准输出流。但是我无法让它在它们到达时将它们一张一张地打印出来。相反,它会等到打印字符串的任何进程完成,然后开始记录信息。那么我该如何正确线程呢?

编辑:将代码减少到最低限度。

最佳答案

我怀疑你是在一个线程中运行它?

当其他代码运行时,Qt 主循环没有运行,因此它没有处理事件(在屏幕上绘图、获取输入等)。因此,当文本框在内部更新时,它不会被绘制到屏幕上,直到您的任务完成,然后窗口被重绘。

最好的解决方案是在单独的线程中运行正在执行输出(并需要一些时间)的进程。

一个快速而肮脏的解决方案是在您向文本框写入内容时手动迭代 Qt 主循环,请参阅 IPython iterate main loop manually? .

关于Python/PyQt/Qt 线程 : How do I print stdout/stderr right away?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8923727/

相关文章:

python - tkinter Text.get() 引发 TypeError 异常

python - 抑制子类文档字符串中的 "Methods inherited by base class"

Python Pandas 试图用我的其他统计数据获取众数

Python 线程队列与多处理管道

java - 用于 IntelliJ 多线程测试的 Java 工具

c++ - QML ListView 和段错误

python - 使用 Django Rest Framework 序列化器创建外键关系的方法

multithreading - Boost::thread() 和 Nvidia CUDA 是否存在某种不兼容?

c++ - 未在禁用的 QCheckBox 上调用 mousePressEvent()

c++ - 在 Qt 5 中连接重载信号和槽