2016-07-12 7 views
0

こんにちは私はcmdのyoutube dlの出力を読んでwxpythonプログラムに入れたいと思います。これは私が使った機能です。youtube-dlのetaのようなパラメータを読む

 def execute(self,command,textctrl): 
       process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
       output = '' 

       # Poll process for new output until finished 
       for line in iter(process.stdout.readline, ""): 
        textctrl.AppendText(line) 
        output += line 


       process.wait() 
       exitCode = process.returncode 

       if (exitCode == 0): 
        return output 
       else: 
        raise Exception(command, exitCode, output) 

wxPythonのプログラムはtextctrlの更新を開始し、その後、凍結しました。

+0

[youtube-dl API](https://github.com/rg3/youtube-dl/blob/master/README.md#embedding-youtube-dl)を使用していないのはなぜですか? – phihag

答えて

0

この機能でブロックされ、コントロールがイベントループに戻ることができない限り、ハンドラにイベントがディスパッチされないことがあります。イベントが送信されずに処理されるので、ウィジェットの内容の再描画や、マウスやキーボードとのやりとりはありません。基本的には、実行機能が心臓を動かさず、脳が他の部分から切り離されているため、アプリケーションはフリーズしています。

GUIまたはイベント駆動型プログラミングの他の実装をプログラミングする場合、イベントハンドラまたはコールバックでイベントループに戻る前に目に見える(人間による)時間以上を要することは決してありません。その時間よりも時間がかかるものがあれば、それを再設計して、長時間実行されるタスクが別の方法で管理されるようにする必要があります。

1つの方法は、イベントハンドラで(プロセスの開始など)設定し、イベントハンドラから返すことです。その設定の一部は、定期的に戻るタイマーを開始し、利用可能な出力があるかどうかを確認することです。そうであれば、それを読んで(ブロッキングなしで)処理してから、イベントループに再度戻ってください。処理が完了するまで続行し、最後のデータチャンクが処理された後にタイマーを停止します。

もう1つの方法は、スレッドを使用して長時間実行されるタスクを実行することです。これは一般的なアプローチですが、ワーカースレッドからUIオブジェクトを操作しないように注意する必要があります。したがって、あなたの例では、プロセスから読み込んだテキストをテキスト・コントロールに追加するためにGUIスレッドに返す必要があります。 wx.CallAfterは簡単な方法です。

詳細およびいくつかの例については、https://wiki.wxpython.org/LongRunningTasksを参照してください。

+0

ありがとうございます。私はそれを試してみて、またリンクに感謝します – Boikem

関連する問題