使用Tkinter进行多线程处理

时间:2014-10-02 13:11:24

标签: python tkinter python-multithreading

我在使用基于Tkinter的GUI时遇到了一些问题。基本上GUI会创建大量线程并运行它们。当每个线程完成后,我希望它更新标签以通知用户这个特定的线程完成。

我知道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。我错过了什么?

1 个答案:

答案 0 :(得分:2)

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

在这里,您将myEvent绑定到app.processEvent的返回值,因为您正在调用该函数而不是仅仅引用它。尝试删除括号。

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