我正在尝试尾部文件并将其连续输出到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()
,而且效果很好。
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_())