2013-08-29 54 views
5

我有一個程序在您單擊操作按鈕後運行一個長時間的過程。當進程正在運行時,即使我知道程序在後臺運行,根窗口也會說它沒有響應。這個計劃將會發布給我和我一起工作的幾個人,我想確保他們不會在他們看到這個時候嚇壞了,關上窗戶。我所擁有的解決方案是在正在運行的進程的循環中放置一個root.update,但我不確定這是否是最好的修復方法。Tkinter窗口顯示(未響應),但代碼正在運行

使用Python 3.3

下面是代碼的樣本,所以你得到的我在做什麼的想法,這是從主循環調用:

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

雖然你可以調用根.update()在你的循環中,這仍然會產生一些(可能)不希望的副作用。

  1. 該程序可能會採取laggy,這意味着需要很長時間才能響應用戶輸入。
  2. 您將只能運行這一個動作。任何其他操作都必須等待完成。

作爲替代方案,我建議您實現簡單的多線程。 Python multithreading非常簡單,並且可以防止這兩個缺點。您將能夠執行長時間運行的代碼,同時仍然提供乾淨且響應式的用戶界面。

如果您的應用程序可以並行化,那麼可以使用多個線程來減少運行時間。防爆。線程1處理條目1-100,而線程2處理條目101-200。

相關問題