gpt4 book ai didi

python - 在多进程中无法更新 QTextEdit

转载 作者:行者123 更新时间:2023-12-01 06:33:15 29 4
gpt4 key购买 nike

我正在尝试尾随文件并将其连续输出到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时,文本框不显示任何内容。我尝试在其中附加一个直接字符串,以确保不是我的阅读行出错了。然而,这不是问题。然后,我尝试使用 print(subA.stdout.readline()) 直接将我的 readline 打印到终端,效果很好。所以我得出的结论是 QTextEdit 文本框 GUI 没有更新。我已经尝试了一切,甚至谷歌也没有给我答案。另外,我可以在文本框中输入内容并正确显示,并且我可以保存输入的内容。我的 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_())

关于python - 在多进程中无法更新 QTextEdit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59793287/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com