2016-04-29 11 views
0

Ich habe QtDesigner verwendet, um einen Assistenten zu machen und konvertiert die .uiDateipyuic4 verwenden.Wie Ausgabe mehrerer Skripte in QTextBrowser umleiten PyQt4 mit

Dieser Assistent hat mehrere Seiten. Eine der Seiten enthält Kontrollkästchen. Die Kontrollkästchen werden verwendet, um bestimmte Python-Skripts auszuwählen, die ausgeführt werden sollen.

Meine Frage ist wie soll ich die ausgewählten Skripte nacheinander über Aufruf gehen und danach, die Ausgabe in Echtzeit zu einem QTextBrowser-Widget in einem der nachfolgenden Seite des Assistenten Umleitung (s).

Schließlich, während die Skripte ausgeführt werden, gibt es eine Option, um die nächsten und hinteren Schaltflächen vorübergehend zu deaktivieren.

Antwort

0

Verwenden Sie QThread, um das Einfrieren der Benutzeroberfläche zu vermeiden; führen Sie Skripts im Thread mit subprocess.Popen mit stdout=PIPE, lesen Sie ihre Ausgabe Zeile für Zeile, emit die Zeilen, und erhalten Sie in was auch immer slot Sie wollen.

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() 

ist jedoch zu beachten, dass aufgrund der Ausgabe der Skripte Pufferung in großen Brocken kommen können, macht es schwierig, die Echtzeit-Glätte wie in Terminal zu erreichen. Mit Python können Sie dies umgehen, indem Sie -u wechseln zum Interpreter (nicht zum Skript).