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