1. 程式人生 > >[Python]_[介面]_[關於tkinter介面使用定時器的問題]

[Python]_[介面]_[關於tkinter介面使用定時器的問題]

場景

1.在開發tkinter介面程式時, 使用工作執行緒處理耗時工作, 想在介面裡顯示工作的進度, 如何繪製?方法1: 像Windows的訊息迴圈那樣, 通過tkinter的類似於PostMessage訊息傳送到主執行緒, 之後主執行緒來處理訊息.方法2: 不傳送訊息到主執行緒, 填充資料到執行緒佇列queue.Queue, 之後主執行緒有定時任務來讀取這個queue.Queue,並繪製進度. 哪個更好呢?

說明

1.第一種方法的缺點就是需要發很多訊息,如果進度比較頻繁的話, 比如讀取檔案大小. 傳送訊息的頻率會很多, 導致主介面響應不過來卡死. 而第二種,可以設定時間間隔是 500ms, 這樣介面會有足夠的時間來響應其他介面事件.所以現在說說第二種的定時器.

2.Pythontkinter並沒有Win32SetTimer函式, 但是有類似的函式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)

參考

tkinter實現定時更換圖片