2013-08-29 7 views
5

アクションボタンをクリックすると、長いプロセスを実行するプログラムがあります。プロセスが実行されているので、プログラムがバックグラウンドで実行されていることがわかっていても、ルートウィンドウは応答していないと言います。このプログラムは、私が働く数人の人にリリースされる予定です。私は、彼らがこれを見て窓を閉め切らないようにしたいと思っています。私が持っている解決策は、実行中のプロセスのループにroot.updateを置いていますが、これが最善の解決策であるかどうかはわかりません。あなたが根を呼び出すことができますがTkinterウィンドウは応答していませんが、コードが実行されています

def combine(boxes_to, boxes_from, frame): 
     to_value,to_pos = gui.checkBoxes(boxes_to) 
     from_value,from_pos = gui.checkBoxes(boxes_from) 
     frame.destroy() 

     running = Label(root,text="Running please do not close..",font = (16)) 
     running.pack() 
     root.update() 
     map_to = open("map_to",'r') 
     for line in map_to: 
      root.update() 
      process(line) 


     running.destroy() 
     map_to.close() 
     finish = Button(root, text="Done",command=gui.stop) 
     finish.pack() 
+2

別のスレッドでバックグラウンドプロセスを実行する必要があります。あなたのシングルスレッドプログラムは、一度に一つのことしかできません。あなたの長時間実行されているプロセスが実行されているとき、UIは追いつくことができません。 – korylprince

答えて

6

:ここでのpython 3.3

を使用して

あなたは私がやっているもののアイデアを得るので、これはメインループから呼び出されるコードのサンプルです.update()をループで実行すると、これでも(望ましくない)副作用が発生します。

  1. プログラムが遅くなることがあります。つまり、ユーザーの入力に応答するのに時間がかかります。
  2. この1つの操作のみを実行することができます。これが完了するのを待つ必要があります。

代わりに、単純なマルチスレッドを実装することをお勧めします。 Python multithreadingはかなりシンプルで、これらの欠点の両方を防ぐことができます。きれいで反応の良いUIを提供しながら、長時間実行しているコードを実行することができます。

アプリケーションが並行して並列化できる場合は、複数のスレッドを使用して実行時間を短縮することができます。 Ex。スレッド1はエントリ1〜100を処理し、スレッド2はエントリ101〜200を処理します。

関連する問題