[Python]_[介面]_[關於tkinter介面使用定時器的問題]
阿新 • • 發佈:2018-12-01
場景
1.在開發tkinter
介面程式時, 使用工作執行緒處理耗時工作, 想在介面裡顯示工作的進度, 如何繪製?方法1: 像Windows
的訊息迴圈那樣, 通過tkinter
的類似於PostMessage
訊息傳送到主執行緒, 之後主執行緒來處理訊息.方法2: 不傳送訊息到主執行緒, 填充資料到執行緒佇列queue.Queue
, 之後主執行緒有定時任務來讀取這個queue.Queue
,並繪製進度. 哪個更好呢?
說明
1.第一種方法的缺點就是需要發很多訊息,如果進度比較頻繁的話, 比如讀取檔案大小. 傳送訊息的頻率會很多, 導致主介面響應不過來卡死. 而第二種,可以設定時間間隔是 500ms, 這樣介面會有足夠的時間來響應其他介面事件.所以現在說說第二種的定時器.
2.Python
的tkinter
並沒有Win32
的SetTimer
函式, 但是有類似的函式after(ms,func)
, 它的含義是延遲特定的毫秒後, 執行某個方法. 通過這個方法裡繼續呼叫after
函式, 達到定時器的效果. 問題就是這個函式是定義在 widgets裡的, 所以自定義的類如果不繼承widgets
相關類是沒有的.
# Methods defined on both toplevel and interior widgets
class Misc:
例子
app.frame.after(500, self.onUpdate) def onUpdate(self): try: valueTuple = blog.gui.utility.get_queue().get(False) if(valueTuple == None): return if(valueTuple[0] == 0): self.text.insert(tkinter.END, valueTuple[1] + "\n") self.text.see(tkinter.END) elif(valueTuple[0] == -1): self.text.insert(tkinter.END, "備份失敗" + "\n") self.removebutton["text"] = self.button1_text self.removebutton["state"]=tkinter.NORMAL return else: self.text.insert(tkinter.END, "備份完成" + "\n") self.removebutton["text"] = self.button1_text self.removebutton["state"]=tkinter.NORMAL return except Exception as e: pass app.frame.after(500, self.onUpdate)