2011-07-10 26 views
1

私はpythonとwxPythonを同時に学んでいます... :)だから、私はコマンドラインからうまく動作するpythonファイルのセットを持っています:./scan -d test ~/Pictures - 例えば "test"という私の写真のデータベースを作成します"wxPython - textctrlウィジェットでシェル出力をキャプチャしますか?

私は(私は、元のコマンドラインのpythonファイルを書いていない)、このためのフロントエンドに熱心に取り組んできた、と私はそれが使用して実行するように取得することができます。これは、問題を提示し

def bt_ScanUpdateClick(self, event): 
    self.SetSizeWH(450,360) 

    ## DEBUG 
    self.tc_MainDatabase.Value = "test.db" 


    if self.tc_MainDatabase.Value == "": 
     self.LogWindow.Value += "ERROR:\tNo database name selected!\n" 
    else: 
     scanCMD = "./scan -d " + self.tc_MainDatabase.Value + " " 

     numLines=0 
     maxLines=(int(self.multiText.GetNumberOfLines())) 

     if self.multiText.GetLineText(numLines) == "": 
      self.LogWindow.Value += "ERROR\tNo folder selected to scan!\n" 
     else: 
      self.LogWindow.Value += "Running Scan...\n\n" 
      while (numLines < maxLines): 
       scanCMD += str(self.multiText.GetLineText(numLines)) + " " 
       numLines += 1 

      self.LogWindow.Value += scanCMD 

      p = subprocess.Popen([scanCMD],shell=True,stdout=subprocess.PIPE,stdin=subprocess.PIPE) 
      self.LogWindow.Value += p.communicate()[0] 

私のために:私は これを有効にする]ボタンをクリックすると

  1. 、それは実際にも、self.SetSizeWH(450360)機能の一部 に を得ることはありません。 「ダウン」状態のままです。 コマンドが実行されると、アプリケーションは 出力ウィンドウ(self.LogView)内のすべてのものを元に戻って になります... は、より多くの出力を得ることを好むでしょう 「リアルタイム」方法が可能です?

+0

上記のBryanの回答とこのリンクの間には、[wxpython:リアルタイムでサブプロセスからの出力をキャプチャする] [1] ...私はこれを実現しました! [1]:http://stackoverflow.com/questions/6677248/wxpython-capturing-an-output-from-subprocess-in-real-time/6680170#6680170 – chow

答えて

1

大まかに言えば、画面更新は、イベントループの各繰り返し中に発生します。コードが実行されている間、イベントループは同じ繰り返しでスタックされているため、画面の更新は行われません。

この問題を回避するには、別のスレッドまたはプロセスで長期実行タスクを実行する必要があります。 wxPythonはシングルスレッドなので、GUIの更新(出力行の作成など)はメインスレッドで行わなければなりません。これを行うには、ワーカースレッドはwx.CallAfterを使用できます。コマンドはGUIスレッドで最も早く実行されるようにスケジュールされます。

詳細については、wxPython WikiのLong Running Tasksページを参照してください。このWebサイトのwxPython: Problems with thread.this answerを参照してください。

関連する問題