【问题标题】:Tkinter traffic-jammingTkinter 交通拥堵
【发布时间】:2014-07-24 07:26:02
【问题描述】:

我有一个通过 Tkinter 回调调用的昂贵函数:

def func:  # called whenever there is a mouse press in the screen.
   print("Busy? " + str(X.busy))  # X.busy is my own varaible and is initialized False.
   X.busy = True
   do_calculations()  # do_calculations contains several tk.Canvas().update() calls
   X.busy = False

当我点击太快时,func() 似乎堆积起来,因为 print 给出“Busy? True”,表明该函数尚未完成,我们正在另一个线程上启动它。

但是,print(threading.current_thread()) 总是给出 <_mainthread started>,对于给定的程序运行,每次打印的 123... 总是相同的。同一个线程怎么可能是多个线程?

【问题讨论】:

  • 我认为 X.busy 不会启动新线程。不是真正的 tkinter 专家,但我找不到说它确实旋转线程的参考。
  • X 只是一个(静态)类,它包含我的一个变量。 func 从 tkinter 调用。
  • OK - 为什么你认为你的代码会启动一个新线程?另外,您在哪个平台上运行?至少在 Windows 上,Tkinter 回调是由消息循环驱动的,因此都在同一个线程上运行。
  • 因为当我运行它时,打印语句返回 True。如果没有多个线程或一个线程被中止,这怎么可能发生?

标签: multithreading python-3.x tkinter


【解决方案1】:

在我看来,您遇到了递归消息处理。特别是,tk.Canvas().update() 将处理所有待处理的消息,包括额外的按钮点击。此外,它将在同一个线程上执行此操作(至少在 Windows 上)。

所以您的线程 ID 是不变的,但您的堆栈跟踪将有多个对 func 的嵌套调用。

【讨论】:

  • ...这就是为什么在你确切地知道为什么你不应该打电话给update之前,你永远不应该打电话给update
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多