2014-10-02 128 views
0

我遇到了一些基於Tkinter的GUI問題。基本上GUI創建了很多線程並運行它們。當每個線程完成後,我希望它更新一個標籤以通知用戶這個特定的線程完成。Tkinter多線程處理

我知道Tkinter小部件不是線程安全的,並且允許子線程更新視圖是一種不好的做法。所以我試圖在主線程上觸發事件,以便它可以更新視圖本身。

我運行下面的簡單代碼示例:

from Tkinter import * 
from threading import * 

def myClass(root): 

    def __init__(self, root): 
     self.root = root 
     # Other stuff populating the GUI 

    # Other methods creating new 'threading.Thread' 
    # objects which will call 'trigger_Event' 

    # Called by child threads 
    def trigger_Event(self): 
     self.root.event_generate("<<myEvent>>", when="tail") 

    # Called by main thread 
    def processEvent(self): 
     # Update GUI label here 

if __name__ == '__main__': 
    root = Tk() 
    root.geometry("500x655+300+300") 
    app = myClass(root) 
    root.bind("<<myEvent>>", app.processEvent()) 
    root.mainloop() 

不幸的是,這並不工作:processEvent永遠不會被調用。我錯過了什麼?

回答

2
root.bind("<<myEvent>>", app.processEvent()) 

在這裏,你要綁定myEvent返回值app.processEvent的,因爲你調用該函數,而不是僅僅提到它。嘗試刪除括號。

root.bind("<<myEvent>>", app.processEvent) 
+0

感謝凱文,這是做的伎倆。與此同時,我發現[這個](http://effbot.org/zone/tkinter-callbacks.htm)頁面,這種錯誤被稱爲'一個普通的初學者'... – GaTTaCa 2014-10-02 13:29:52