2017-07-13 3 views
0

PyQt4アプリケーションがQProcessにあるpingを実行している場合にのみ、QProcess標準出力を印刷します。 self.outputという名前のQTextEditは、pingのすべてを出力します。 2番目のQTextEditという名前のself.summaryは、文字列がTTLの場合のみ出力されます。サブストリング(PyQt4)

問題:私は私がdataReady機能でそのコードを書く方法を確認していないとして働いself.outputを得ることなく、self.summaryに管理しています。何か案は?あなたが持っている可能性が

enter image description here

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

一つの問題は、つまりは、私たちはそれを分けるという問題を持っていないために、"\n"を含み、その後、我々は検索を行うQProcessの各出力は、いくつかのラインを持っている可能性があることです。

for line in processStdout.split("\n"): 
    if "TTL" in line: 
     cursorSummary.insertText(line+"\n") 

最初のコードでは、エラーを生成しているforループで各文字を取得しています。

enter image description here

注:私は言葉ttlでフィルタする必要があり、Linuxで。 QProcessを次のように変更することに加えて、self.process.start('ping', ['-c', '3', '127.0.0.1'])