Das gleiche Problem habe ich auch und deshalb bin ich mal so frei und klinke mich hier ein. Ich habe ebenfalls eine Gui mit dem Qt creator erstellt und bin gerade dabei den Rest fertig zu stellen.
Kurz zu meinem Programm:
Platform: Windows 7
Python 3.7
PyQT5
Das Programm soll die CMD-Line Version eines Import/Export Programms aufrufen und je nach Auswahl und Konfiguration in der Gui verschiedene Parameter übergeben. Es hat einen QTextEdit Bereich in dem die Ausgabe live angezeigt werden soll.
Ich habe dieses Problem wie @__blackjack__ beschrieben hat mit subprocess.Popen gelöst. Hierbei wird vom subprocess stdout und stderr "gepiped". Die leite ich dann per communicate() an stdout und stderr der Main weiter:
Code: Alles auswählen
def importhelper(self, befehl):
with subprocess.Popen(befehl ,stdout=subprocess.PIPE, stderr=subprocess.PIPE) as p:
output, errors = p.communicate()
lines = output.decode('iso8859-1')
print(lines)
Für die weiterleitung von stdout an meinen QTextEdit habe ich eine Klasse erstellt und noch ein paar Funktionen in meiner QMainWindows hinzugefügt:
Code: Alles auswählen
class Stream(QtCore.QObject):
newText = QtCore.pyqtSignal(str)
def write(self, text):
self.newText.emit(str(text))
Code: Alles auswählen
class ozi(QtWidgets.QMainWindow):
def onUpdateText(self, text):
cursor = self.process.textCursor()
cursor.movePosition(QtGui.QTextCursor.End)
cursor.insertText(text)
self.process.setTextCursor(cursor)
self.process.ensureCursorVisible()
def __del__(self):
sys.stdout = sys.__stdout__
def __init__(self):
super(ozi, self).__init__()
#Lade Fenser aus gui Datei
self.ui = gui.Ui_MainWindow()
self.ui.setupUi(self)
#stdout stream ausgabe
sys.stdout = Stream(newText=self.onUpdateText)
self.process = QtWidgets.QTextEdit(self.ui.tab11)
self.process.setGeometry(QtCore.QRect(10, 390, 801, 121))
self.process.setObjectName("textBrowser1")
self.process.moveCursor(QtGui.QTextCursor.Start)
self.process.ensureCursorVisible()
self.process.setLineWrapColumnOrWidth(500)
self.process.setLineWrapMode(QtWidgets.QTextEdit.FixedPixelWidth)
Soweit so gut. Die Ausgabe wird an die GUI weitergeleitet und halbwegs lesbar (leider wegen decode ohne Umlaute) ausgegeben, ABER wie @__blackjack__ erwähnte friert dadurch die GUI ein und die Ausgabe erscheint erst, nachdem der Subprocess beendet wurde. Ich bin ein absoluter Python und PYQT Neuling und komme leider zum verrecken nicht weiter und verstehe ehrlich gesagt auch nicht, warum das Fenster erst aktualisiert wird, nachdem die Schleife in die Main zurück springt. Vielleicht können wir gemeinsam versuchen eine Lösung zu finden, oder jemand hilft uns etwas auf die Sprünge
