2014-11-03 121 views
0

我有一個使用有限元方法進行計算的程序,可能需要花費幾分鐘時間。 由於該程序對於用戶來說可能已凍結,因此我計算了它預先計算的迭代次數,並將百分比進度打印到TKinter中的文本小部件。TKinter:文本小部件在程序運行時不更新

問題是當程序迭代時主窗口凍結,並且只在最後更新文本,這對用戶知道當前計算進度沒有多大用處。

下面的代碼的特定部分:

progr+=dcompl 
textbox.configure(state=NORMAL) 
textbox.delete(1.0,2.0) 
textbox.insert(1.0,"Processando... ") 
textbox.insert(2.0,str(int(progr))+"%") #the variable progr is the current progress in % 
textbox.configure(state=DISABLED) 

它的「程序控制」變量每次通過代碼的特定部分時間更新。

如果我只是將「progr」變量打印到控制檯,它工作得很好,但我希望用戶在查看UI而不是在控制檯。

有沒有什麼辦法可以讓TKinter窗口不凍結並在程序運行時更新文本?

回答

-1

您可以導入threading模塊並在單獨的threading.Thread的背景中運行您的編號處理代碼,或者您可以導入subprocess模塊並在完全獨立的過程中運行它。在必須留在主線程中的tkInter代碼中,您需要等到線程/子進程向您發送完成併發送結果的信號。 (切記不要從後臺線程訪問任何Tkinter的對象,但:在Tkinter的工具包是不是線程安全的,這將導致零星的崩潰。)

針對布萊恩的評論:

你是如何「等待」無需捆綁CPU?我的一些應用程序使用了一個簡單的循環,其中包含1毫秒的time.sleep(),所得到的性能並不明顯。但是,要正確執行此操作,您可能需要使用tkinter對象的.after()機制來重複調用一個函數來檢查背景編號的運算狀態。

+1

您從不想在GUI的主線程中調用'sleep',因爲它會在整個GUI處於休眠狀態時凍結整個GUI。 – 2014-11-03 23:18:29

+0

謝謝。我使用線程模塊來創建一個不同的線程,這解決了我的問題。 – 2014-11-04 20:02:47

0

如果我只是將「progr」變量打印到控制檯,它工作得很好,但我希望用戶在查看UI而不是在控制檯。

如果您使用標籤而不是文本並更新打印的Tkinter變量,它應該可以正常工作。

def change_value(): 
    ## get the value because this program doesn't 
    ## have a separate variable to use for the set() 
    val=progr.get() 
    if val < 100: 
     ## show that the same function can be called many times with updates 
     textbox.after(50, change_value) 
    progr.set(val+2) 

top=Tk() 
textbox=Label(top, text="Processando... ") 
textbox.grid() 

progr=IntVar() 
progr.set(1) 
Label(top, textvariable=progr).grid(row=1) 

change_value() 

top.mainloop() 
相關問題