2017-11-30 40 views
0

こんにちは、私はPyQtの初心者です。 誰かが以下のプログラムがテキストボックスウィジェットにリアルタイムでprint.pyのstdoutを投入しない理由を提案することができますか?この問題はコマンドラインから実行しているときに存在します。pycharmでsamecodeを実行していると、コマンドラインを実行すると、データがテキストボックスにチャンク(約4K)として表示されます。ここで コマンドラインからPyQtプログラムを実行してもコンソール出力がリアルタイムでルーティングされない

from PyQt4 import QtGui,QtCore 
import sys 

class gui(QtGui.QMainWindow): 
    def __init__(self): 
     super(gui, self).__init__() 
     self.initUI() 

    def dataReady(self): 
     cursor = self.output.textCursor() 
     cursor.movePosition(cursor.End) 
     cursor.insertText(str(self.process.readAll())) 
     self.output.ensureCursorVisible() 

    def initUI(self): 
     # Layout are better for placing widgets 
     layout = QtGui.QHBoxLayout() 
     self.output = QtGui.QTextEdit() 

     layout.addWidget(self.output) 

     centralWidget = QtGui.QWidget() 
     centralWidget.setLayout(layout) 
     self.setCentralWidget(centralWidget) 

     # QProcess object for external app 
     self.process = QtCore.QProcess(self) 
     # QProcess emits `readyRead` when there is data to be read 
     self.process.readyRead.connect(self.dataReady) 

     # Run program 
     self.process.start('python', ['./print.py']) 

#Function Main Start 
def main(): 
    app = QtGui.QApplication(sys.argv) 
    ui=gui() 
    ui.show() 
    sys.exit(app.exec_()) 
#Function Main END 

if __name__ == '__main__': 
    main() 

は、サブプロセスで実行されているprint.py

import time 
n=10 
while(n): 
    print "Hello world" 
    time.sleep(1) 
    n = n-1 
+0

print.pyでprintを呼び出すたびに、明示的に 'sys.stdout.flush()'で標準出力をフラッシュしようとしましたか? –

+0

それはクールです...うまく動作します..! – ZeeBlue

答えて

1

あなたが明示的にprint.pyスクリプト(子スクリプト)の出力バッファをフラッシュしなければならないためのコードです。 printのデフォルトの動作は、標準出力(stdout)に出力を送信することです。そのため、子スクリプトのprintステートメントの内容を親スクリプトが適時に利用できるようにするために、各printステートメントの後に子スクリプト内に明示的にsys.sydout.flush()を呼び出す必要があります。

関連する問題