2016-11-24 1 views
0

Ich habe eine Datei script.py, die einige Operationen ausführt und einige "print" -Anweisungen verwendet, um mit dem Benutzer zu kommunizieren.Skript in einem anderen Thread ausführen und Ausgabe in Echtzeit auf GUI schreiben (pyqt5)

Mit PyQt5 habe ich eine separate Datei gui.py erstellt, wo ich eine GUI mit einigen Widgets erstellt habe, einschließlich einer "run" -Schaltfläche und einem QTextEdit. Wenn ich diese Taste drücken, ich will „script.py“ ausgeführt werden und jede Zeile seiner Ausgabe auf meinem QTextEdit in Echtzeit

umgeleitet werden konnte ich das Skript auszuführen, und zeigen Sie Ausgabe ist ... Obwohl es auf der Konsole einwandfrei funktioniert, wird QTextEdit nur aktualisiert, wenn script.py die Ausführung abgeschlossen hat.

Dies ist mein Code:

class gui(QWidget): 
    def __init__(self): 
     super().__init__() 

     self.initUI() 

    def initUI(self): 

     def run(): 
      try: 
       p = subprocess.Popen("python script.py", stdout=subprocess.PIPE) 
       for line in iter(p.stdout.readline, b''): 
        if line != "b''": 
         line = str(line)[2:-5] # eliminates b' and \r\n' 
         print(line) # This works real-time 
         output.append(line) # this does not 
       p.stdout.close() 
       p.wait() 

      except Exception as e: 
       print(str(e)) 


     button_run = QPushButton("&Run", self) 
     button_run.clicked.connect(run) 

     output = QTextEdit() 
     output.setPlaceholderText("Text will appear here") 
     output.setReadOnly(True) 

     """ 
      rest of initUI.... 
     """ 


if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    ui = gui() 
    sys.exit(app.exec_()) 

Ich versuchte QProcess zu verwenden, aber ich kann meinen Kopf um es nicht wickeln.

+0

Mögliche Duplikat [PyQt5 Threads in Echtzeit logging] (http://stackoverflow.com/questions/40575455/pyqt5-threads-real-time-logging) – Trilarion

Antwort

0

Sie sollten einen Worker-Thread verwenden und Ihre Haupt-App mit Ihrem Mitarbeiter über Qt-Slots und -Signale kommunizieren. Siehe this example es ist in C++ codiert, aber ist nützlich, um die Idee zu bekommen.

+0

Das c ist ++, nicht QML – user3419537

+0

Das ist richtig. Bearbeitet :) –

0

Das wird viel einfacher, mit Qt seiner QProcess statt subprocess in einem Thread mit - es hat Dinge wie ein readyRead Signal und ein readLine Verfahren.

+0

QProcess scheint extrem problematisch und kompliziert zu sein (für mich zumindest), ich kann nicht einmal ein Skript damit ausführen. Es scheint mir rätselhaft, dass ich kein einziges Beispiel für QProcess für PyQt im Web finden kann –

Verwandte Themen