在多进程中无法更新 QTextEdit

Can't Update QTextEdit While in a Multiprocess

我正在尝试拖尾文件并将其连续输出到 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()) 将我的 readline 直接打印到终端,效果很好。所以我得出结论,QTextEdit 文本框 GUI 没有更新。我已经尝试了所有方法,甚至 Google 都没有给我答案。 此外,我可以在文本框中输入内容并正确显示,而且我可以保存我输入的内容。我的 GUI 似乎不喜欢多进程,因为我可以在多进程之外调用 .append(),而且它工作得很好。

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