在多进程中无法更新 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_())
我正在尝试拖尾文件并将其连续输出到 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_())