无法在pyqt广告位

时间:2017-10-14 16:51:37

标签: python pyqt5 signals-slots

我创建了一个QPushButton小部件和一个QTextEdit小部件,我想要的是,一旦我点击按钮,系统将执行一个外部程序,并将日志输出到QTextEdit小部件。

问题是日志不能连续发送到QTextEdit小部件。外部程序完成后立即发送。为什么呢?

这是我的代码:

class Window(Qwidget):
    def __init__(self, parent=None):
        ...
        self.button.clicked.connect(self.onStart)  
        ...
    def onStart(self):
        # keep sending log in this solt, similar to my external program
        for i in range(10000):
            self.logger.debug(str(i))

我已经将self.logger.debug()重定向到sys.stdout,并将日志输出到线程中的QTextEdit小部件。

class myThread(QThread):
    printText = pyqtSignal(str)

    def __init__(self, parent=None):
        super(myThread,self).__init__(parent)

    def write(self, output):
        self.printText.emit(output)

    def flush(self):
        pass

    def run(self):
        while True:
            time.sleep(.1)

单击按钮时,pyqt卡在循环for i in range(10000)中并且不显示任何内容。几秒钟后,所有输出日志一次全部显示,而不是实时显示。

1 个答案:

答案 0 :(得分:0)

作为ekhumoro的建议,我把循环放在一个线程中:

def onStart(self):
    _thread.start_new_thread(self.myLoop, ())
def myLoop(self):
    for i in range(10000):
        self.logger.debug(i)

_thread模块符合我的功能要求并且在此处运行良好。如果您需要与myLoop()threadingqueue中的其他主题进行通信,则功能更强大。