2012-01-19 9 views
3

私はグーグルドしたたくさんの例を扱っていましたが、ここでstackoverflowのスレッディングについての質問を見ましたが、それでもそれを得ることはできません。ここでPython/PyQt/Qt Threading:stdout/stderrをすぐに印刷するにはどうしたらいいですか?

は、私が働いているいくつかのサンプルコードです:

class Debugger(QTextBrowser): 
    def __init__(self, parent): 
     super(Debugger, self).__init__(parent) 
     sys.stdout = self 

    def write(self, text): 
     self.moveCursor(QTextCursor.End) 
     self.textCursor().insertText(text) 

基本的に、私は、任意の「印刷」の文またはstdoutstreamへの書き込みの他の形態をキャッチしようとしています。しかし、到着時に1枚ずつプリントすることはできません。代わりに、文字列を印刷するプロセスが終了してから情報のログを開始するまで待機します。だから私はこれを適切にスレッド化するのですか?

編集:コードを最小限に抑えました。

+0

私は確信していませんが、ここで起こっていることは、ストリームが 'flush()'になるまで書かれたものであることです。もし自分のコードが書いているのであれば、ただ待たなければならないクライアントコードなら、ストリームに 'write()'を書くとすぐに 'flush()'を呼び出すようにしてください。 – snim2

+0

それは問題ではありません。私は以下を試した:1) 'self.oldstdout = sys.stdout'を' Debugger .__ init'に追加しました2) 'self.console.oldstdout.write(text)'を 'StdoutStream.write'に追加しました。そして、これが起こった:pythonコンソールは文字列をすぐに表示したが、デバッガQTextBrowserはプロセス全体が終了するまで待った。 – Jeff

+0

可能な複製http://stackoverflow.com/questions/2859256/how-to-redirect-a-python-console-output-to-a-qtextbox – synthesizerpatel

答えて

0

あなたはそれをすべて1つのスレッドで実行していると思いますか?

他のコードが実行されている間、Qtメインループは実行されていないため、イベントを処理していません(画面上の描画、入力など)。そのため、内部的にテキストボックスが更新されている間は、タスクが完了してからウィンドウが再描画されるまで、画面にペイントされません。

最適な解決策は、出力を行っているプロセスを別のスレッドで実行することです(時間がかかります)。

テキストボックスに何かを書き込んだら、Qtメインループを手作業で繰り返してください。IPython iterate main loop manually?を参照してください。

関連する問題