我使用QtDesigner
创建了一个向导,并使用.ui
转换了pyuic4
文件。
此向导有多个页面。其中一个页面包含复选框。复选框用于选择要运行的某些python脚本。
我的问题是我应该如何依次调用所选脚本,在任何后续向导中将输出实时重定向到QTextBrowser
小部件网页。
最后,当脚本运行时,可以选择暂时禁用下一个和后一个按钮。?
答案 0 :(得分:0)
使用QThread
来避免UI冻结;
使用带有subprocess.Popen
的{{1}}在线程中运行脚本,
逐行读取他们的输出,stdout=PIPE
这些行,并将它们放入你想要的任何emit
。
slot
但是请注意,由于缓冲,脚本的输出可能会有很大的块,
难以像终端那样实现实时平滑。
使用python,您可以通过将from PyQt4.QtGui import QTextBrowser, QApplication
from PyQt4.QtCore import pyqtSignal, QThread
from subprocess import Popen, PIPE
from Queue import Queue
from threading import Event
class ScriptRunner(QThread):
# fired whenever a line from subprocess.stdout arrived
got_line = pyqtSignal(unicode)
def __init__(self):
QThread.__init__(self)
self.queue = Queue()
self.put = self.queue.put
self.stop_event = Event()
self.start()
def run(self):
"""thread function"""
while 1:
script = self.queue.get()
if script is None: # no more scripts
break
# run the script
proc = Popen(script, bufsize=1, stdout=PIPE, shell=True,
universal_newlines=True)
# read its output line by line
while not self.stop_event.is_set():
line = proc.stdout.readline()
if not line:
break
self.got_line.emit(line)
def join(self):
self.stop_event.set()
self.put(None)
self.wait()
if __name__ == '__main__':
app = QApplication([])
text_browser = QTextBrowser()
text_browser.show()
runner = ScriptRunner()
# connect to got_line signal
runner.got_line.connect(text_browser.insertPlainText)
# schedule a script
runner.put('''python -c "for i in range(25): print 'dada'; import time; time.sleep(.25)"''')
# now force python to flush its stdout; note -u switch
runner.put('''python -uc "for i in range(25): print 'haha'; import time; time.sleep(.25)"''')
app.exec_()
runner.join()
切换到解释器(而不是脚本)来避免这种情况。