【问题标题】:tkinter issues in PythonPython 中的 tkinter 问题
【发布时间】:2014-09-20 17:28:50
【问题描述】:

完成这项工作的最佳方法是什么? showinfo 处挂起的脚本:

from tkinter import *
from tkinter.messagebox import *
from threading import Timer

def timerDone():
    showinfo('Alert','Alert')

window = Tk()
mainTimer = Timer(3, timerDone)
mainTimer.start()

window.mainloop()

我使用 Python 3。有没有办法让它在没有队列或额外导入的情况下工作?

我不使用“after”方法,因为计时器可以停止或更改 - 我有很多计时器可以动态更改间隔,这非常不方便。

【问题讨论】:

标签: python multithreading timer tkinter


【解决方案1】:

这里讨论过:python tkinter with threading causing crash

Tkinter 不是线程安全的;除了主线程之外,您无法从任何地方访问 Tkinter 小部件。

您应该删除 Timer 实例化。 Tk 有自己的用于调度事件的工具,称为after 方法。

from tkinter import *
from tkinter.messagebox import *

def timerDone(window):
    showinfo('Alert','Alert')
    window.destroy()

window = Tk()
window.after(3000,lambda:timerDone(window))
window.mainloop()

这与使用after 实现的脚本相同。我还添加了一个window.destroy() 调用来中断主循环。

您的问题有几个解决方案。最简单的方法是使用after_cancel 方法停止执行回调。还值得注意的是,after 事件绑定到一个小部件,因此如果拥有 after 的小部件被销毁,则永远不会执行回调。

【讨论】:

  • 谢谢。除了after,真的没有其他选择吗?我真的很喜欢使用计时器,尤其是当我有很多计时器时(10-15)。使用isAlive, finished, function, interval 等非常方便地控制它们。
  • 有很多选择。例如,您可以创建设置事件的计时器实例,然后通过回调来检查它们的状态。基本上如果你想使用定时器,你必须将它们与调用后一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 2016-05-25
  • 2018-05-17
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多