2014-10-02 127 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