在多进程中无法更新QTextEdit

问题描述 投票:0回答:1

我正在尝试尾部文件并将其连续输出到QTextEdit框。但是,我的子流程和输出位于多流程中。这是我的代码:

shouldRun = True
wMain = QtGui.QWidget()
textboxSideA = QtGui.QTextEdit(wMain)

def tailLog():
    subA = subprocess.Popen(["tail", "-F", "<FILENAME>", stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=os.setsid)
    pollA = select.poll()
    pollA.register(subA.stdout)

    while shouldRun:
        if pollA.poll(1):
            textboxSideA.append(subA.stdout.readline())
    subA.kill()
    os.killpg(subA.pid, signal.SIGKILL)
    return

processSideA = multiprocessing.Process(target = tailLog)
processSideA.start()

wMain.show()

textboxSideA.append被调用时,文本框不显示任何内容。我尝试仅在其上附加直接字符串以确保不是我的readline不好。但是,这不是问题。然后,我尝试使用print(subA.stdout.readline())将我的阅读行直接打印到终端,效果很好。因此,我得出结论,QTextEdit文本框GUI尚未更新。我已经尝试了一切,甚至Google都没有给我答案。另外,我可以在文本框中输入内容,并且可以正确显示,并且可以保存输入的内容。我的GUI似乎不喜欢多进程,因为我可以在多进程之外调用.append(),而且效果很好。

python pyqt pyqt4 python-2.6
1个回答
0
投票

Qt不支持多处理,因此从另一个进程更新GUI是危险的,GUI只能并且应该从创建它的进程线程中进行更新。

另一方面,由于可以使用QProcess,因此不必使用多处理:

import sys

from PyQt4 import QtCore, QtGui


class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.process = QtCore.QProcess(self)
        self.process.setProcessChannelMode(QtCore.QProcess.MergedChannels)
        self.process.readyReadStandardOutput.connect(self.on_readyReadStandardOutput)
        self.textedit = QtGui.QTextEdit()

        self.setCentralWidget(self.textedit)

    def tail(self, filename):
        self.process.kill()
        self.process.start("tail", ["-F", filename])

    @QtCore.pyqtSlot()
    def on_readyReadStandardOutput(self):
        msg = self.process.readAllStandardOutput().data().encode()
        self.textedit.append(msg)


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    w = MainWindow()
    w.tail("<FILENAME>")
    w.show()
    sys.exit(app.exec_())
© www.soinside.com 2019 - 2024. All rights reserved.