Echtzeitausgabe eines Unterprogramms an die Standardausgabe eines pyQT-Widgets

Hallo, ich habe gesehen, dass es zu diesem Thema bereits viele Fragen gibt, aber keine scheint meine Frage zu beantworten.

Laut untenstehendem Link habe ich sogar winpexpect ausprobiert, da ich Windows benutze, aber es scheint, als würde es für mich funktionieren.Echtzeit-Ausgabe von ffmpeg zur Verwendung in der Fortschrittsanzeige abrufen (PyQt4, stdout)

Ich führe ein Unterprogramm mit subprocess.Popen aus und möchte das Echtzeitergebnis in einem pyQt-Widget sehen. Derzeit wird das Ergebnis im pyQt-Widget angezeigt, jedoch erst, nachdem der Unterbefehl ausgeführt wurde. Ich muss wissen, ob es eine Möglichkeit gibt, die Ausgabe eines Unterprozesses in Echtzeit in das Fenster zu übertragen. Siehe den folgenden Code, den ich für all dies versucht habe.

import sys
import os
from PyQt4 import QtGui,QtCore
from threading import Thread
import subprocess
#from winpexpect import winspawn



class EmittingStream(QtCore.QObject):
    textWritten = QtCore.pyqtSignal(str)

    def write(self, text):
        self.textWritten.emit(str(text))

class gui(QtGui.QMainWindow):

    def __init__(self):
    # ...
        super(gui, self).__init__()
    # Install the custom output stream
        sys.stdout = EmittingStream(textWritten=self.normalOutputWritten)
        self.initUI()

    def normalOutputWritten(self, text):
        cursor = self.textEdit.textCursor()
        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertText(text)
        self.textEdit.ensureCursorVisible()

    def callProgram(self):

        command="ping 127.0.0.1"
        #winspawn(command)
              py=subprocess.Popen(command.split(),stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
        result,_=py.communicate()
        for line in result:
            print line
        print result


    def initUI(self):
        self.setGeometry(100,100,300,300)
        self.show()

        self.textEdit=QtGui.QTextEdit(self)
        self.textEdit.show()
        self.textEdit.setGeometry(20,40,200,200)

        print "changing sys.out"
        print "hello"

        thread = Thread(target = self.callProgram)
        thread.start()


#Function Main Start
def main():
    app = QtGui.QApplication(sys.argv)
    ui=gui()
    sys.exit(app.exec_())
#Function Main END

if __name__ == '__main__':
    main()

Antworten auf die Frage(1)

Ihre Antwort auf die Frage