仅当包含子字符串时才打印 QProcess Stdout [英] Printing QProcess Stdout only if it contains a Substring

查看:41
本文介绍了仅当包含子字符串时才打印 QProcess Stdout的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

PyQt4 应用程序在 QProcess 中运行 ping.名为 self.outputQTextEdit 将输出 ping 的所有内容.名为 self.summary 的第二个 QTextEdit 只会输出包含字符串 TTL 的行.

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.

问题:我已经设法让 self.output 工作但不是 self.summary 因为我不知道如何编写它的代码在 dataReady 函数中.有什么想法吗?

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

推荐答案

您可能遇到的一个问题是 QProcess 的每个输出可能有几行,即包含 "\n",为了没有那个问题,我们把它分开,然后我们进行搜索:

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")

在您的初始代码中,您使用 for 循环获取每个字符,这会产生错误.

In your initial code you are getting each character with the for loop, which is generating the error.

注意: 在 linux 中,我必须按单词 ttl 进行过滤.除了将 QProcess 更改为:self.process.start('ping', ['-c', '3', '127.0.0.1'])

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'])

这篇关于仅当包含子字符串时才打印 QProcess Stdout的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆