我试图将stdout从子程序重定向到QTextBrowser小部件。 (Python 2.7,Window 7,pyQT4)
这是子程序,它将在一个可执行文件中:
#test.py
import time
print ("ABC")
time.sleep(1)
print ("DEF")
time.sleep(1)
print ("GHI")
time.sleep(1)
print ("JKL")
我的pyQT4程序:
from PyQt4 import QtGui
import subprocess, time, os, sys
from subprocess import Popen, PIPE
class GUI (QtGui.QWidget):
def __init__(self):
...
self.initUI()
def initUI(self):
...
self.edit = QtGui.QTextBrowser()
grid.addWidget (self.edit, 7, 0, 5, 7)
def run(self):
p = Popen (['C:\\...\\test.exe'], stdout=PIPE, stderr=subprocess.STDOUT)
while True:
line = p.stdout.readline()
if not line:
break
self.append_edit('>>>' + line)
def append_edit(self, string):
self.edit.append(string)
def main():
app = QtGui.QApplication(sys.argv)
upgrade = GUI()
sys.exit (app.exec_())
我上面的程序将等到子程序完成运行然后将所有内容打印到窗口小部件中。我想要的是让程序输出ABC
然后DEF
,然后在子程序正在运行的小部件之间输入一秒钟。
编辑:我可以将子进程输出到cmd就好了,但是,如果我将它打印到QTextBrowser中,它将无法工作。
我已经看到很多关于这个问题的问题,但他们似乎都没有回答我的问题。
提前致谢。
编辑:我还是python的新手。我认为这可能是问题:通过添加 QtGui.QApplication.processEvents()
def initUI(self):
...
running = QtGui.QPushButton('Run')
running.clicked.connect(self.run)
def run(self):
time.sleep(1)
append_edit('Before')
time.sleep(2)
append_edit('After')
所以当我在我的程序中运行时,而不是先打印出来然后等待1秒,它总共等待3秒然后打印前后。是什么导致了这个问题?
修改:即使我的代码中包含QtGui.QApplication.processEvents()
,我仍然遇到同样的问题。它会在显示输出到QTextBrowser之前运行整个子程序。