Python/PyQt/Qt线程:如何立即打印stdout/stderr?

3 投票
1 回答
1310 浏览
提问于 2025-04-17 10:36

我查了很多例子,也在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)

简单来说,我想捕捉任何'print'语句或者其他写入标准输出流的方式。但我无法做到逐个打印它们,而是等到打印字符串的那个过程结束后,才开始记录信息。那么,我该如何正确地使用线程呢?

编辑:把代码简化到最基本的部分。

1 个回答

0

我怀疑你是在一个线程里运行所有的代码吧?

当其他代码在运行时,Qt的主循环就没法运行了,所以它无法处理事件,比如在屏幕上绘图、接收输入等等。因此,虽然文本框内部在更新,但在屏幕上并不会显示出来,直到你的任务完成,然后窗口才会重新绘制。

最好的解决办法是把那些需要输出(而且耗时)的过程放到一个单独的线程里去运行。

一个简单粗暴的解决办法是,每当你往文本框里写东西时,手动让Qt的主循环运行一下,具体可以参考这个链接:IPython手动迭代主循环?

撰写回答