9

在一个类中,在一个函数中,我正在创建一个 Tkinter 画布。这个函数正在被另一个类调用,我想让 Tkinter 窗口弹出 30 秒然后自行关闭。我有它的电话

master.mainloop()
time.sleep(30)
master.destroy() 

但我得到一个错误

“elf.tk.call('destroy',self._w)_tkinter.TclError:无法调用“destroy”命令:应用程序已被销毁”

那么我怎样才能让它自己关闭呢?

4

2 回答 2

25

不要time.sleep()与 tkinter 一起使用。相反,请在after要关闭的小部件上调用该函数。

这是最简单的例子:

import tkinter as tk

w = tk.Tk()
w.after(30000, lambda: w.destroy()) # Destroy the widget after 30 seconds
w.mainloop()
于 2013-03-09T01:55:28.767 回答
4

这里的问题是mainloop()直到 GUI 关闭才返回。

因此,在 GUI 关闭并自行销毁30 秒后,您尝试将其销毁。显然这失败了。

但是你不能只在主循环中移动sleepanddestroy调用,因为如果你sleep在主循环的中间,GUI 将冻结。

因此,您需要某种不会停止主循环的计时器。tkinter包括after用于该目的的方法。这个答案给出了一个使用它的详细例子。

于 2013-03-09T01:55:12.423 回答