繁体   English   中英

在另一个线程中执行脚本并在gui(pyqt5)上实时写入输出

[英]Execute script in another thread and write output in real-time on gui (pyqt5)

我有一个文件script.py,它执行一些操作并使用一些“打印”语句与用户通信。

使用PyQt5,我创建了一个单独的文件gui.py,在其中创建了包含一些小部件的GUI,其中包括“运行”按钮和QTextEdit。 当我按下该按钮时,我想执行“ script.py”并将其输出的每一行实时重定向到我的QTextEdit

我设法执行了脚本并查看了它的输出...但是,尽管它可以在控制台上完美运行,但仅当script.py完成执行后才更新QTextEdit。

这是我的代码:

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

我尝试使用QProcess,但无法将其包裹住。

您应该使用一个工作线程,并通过Qt插槽和信号与您的工作人员交流主应用程序。 看到这个例子,它是用c ++编码的,但是对于理解这个想法很有用。

使用Qt的QProcess而不是在线程中使用subprocess进程会更加容易-它具有readyRead信号和readLine方法之类的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM