问题
A PyQt4 app runs ping in a QProcess. A QTextEdit named self.output will output everything from ping. A second QTextEdit named self.summary will only output the line if it contains the string TTL.
Problem: I have managed to get self.output working but not self.summary as I am not sure how to write its code in the dataReady function. Any ideas?
import sys
from PyQt4 import QtGui, QtCore
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.initUI()
def dataReady(self):
cursorOutput = self.output.textCursor()
cursorSummary = self.summary.textCursor()
cursorOutput.movePosition(cursorOutput.End)
cursorSummary.movePosition(cursorSummary.End)
processStdout = str(self.process.readAll())
# Update self.output
cursorOutput.insertText(processStdout)
# Update self.summary
for line in processStdout:
if 'TTL' in line:
cursorSummary.insertText(line)
self.output.ensureCursorVisible()
self.summary.ensureCursorVisible()
def callProgram(self):
self.process.start('ping', ['127.0.0.1'])
def initUI(self):
layout = QtGui.QHBoxLayout()
self.runBtn = QtGui.QPushButton('Run')
self.runBtn.clicked.connect(self.callProgram)
self.output = QtGui.QTextEdit()
self.summary = QtGui.QTextEdit()
layout.addWidget(self.runBtn)
layout.addWidget(self.output)
layout.addWidget(self.summary)
centralWidget = QtGui.QWidget()
centralWidget.setLayout(layout)
self.setCentralWidget(centralWidget)
# QProcess object for external app
self.process = QtCore.QProcess(self)
self.process.readyRead.connect(self.dataReady)
self.process.started.connect(lambda: self.runBtn.setEnabled(False))
self.process.finished.connect(lambda: self.runBtn.setEnabled(True))
def main():
app = QtGui.QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
回答1:
One problem that you could have is that each output of QProcess could have several lines, ie contain "\n", to not have that problem we separate it, and then we do the search:
for line in processStdout.split("\n"):
if "TTL" in line:
cursorSummary.insertText(line+"\n")
In your initial code you are getting each character with the for loop, which is generating the error.
Note: In linux I have to filter by the word ttl. In addition to changing the QProcess to: self.process.start('ping', ['-c', '3', '127.0.0.1'])
来源:https://stackoverflow.com/questions/45087825/printing-qprocess-stdout-only-if-it-contains-a-substring