我创建了一个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)
中并且不显示任何内容。几秒钟后,所有输出日志一次全部显示,而不是实时显示。
答案 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()
,threading
和queue
中的其他主题进行通信,则功能更强大。