如何使用PyQt4重定向QTextBrowser中多个脚本的输出

时间:2016-04-29 20:14:28

标签: python qt pyqt pyqt4 wizard

我使用QtDesigner创建了一个向导,并使用.ui转换了pyuic4 文件

此向导有多个页面。其中一个页面包含复选框。复选框用于选择要运行的某些python脚本。

我的问题是我应该如何依次调用所选脚本,在任何后续向导中将输出实时重定向到QTextBrowser小部件网页。

最后,当脚本运行时,可以选择暂时禁用下一个和后一个按钮。?

1 个答案:

答案 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() 切换到解释器(而不是脚本)来避免这种情况。