在一定时间后自动关闭窗口

10 投票
2 回答
26663 浏览
提问于 2025-04-17 18:28

在一个类里,我有一个函数用来创建一个Tkinter的画布。这个函数是被另一个类调用的。我想让Tkinter的窗口弹出来显示30秒,然后自己关闭。我用的是

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

但是我遇到了一个错误

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

那么我该怎么让它自己关闭呢?

2 个回答

4

这里的问题是,mainloop() 这个函数在图形界面(GUI)关闭之前是不会返回的。

所以,在图形界面关闭并自我销毁后,过了30秒你再去尝试销毁它,这显然是失败的。

但是,你不能把 sleepdestroy 这两个调用放进主循环里,因为如果你在主循环中间使用 sleep,图形界面就会卡住。

因此,你需要一种不会停止主循环的计时器。tkinter 提供了 after 方法,正是为了这个目的。这个回答 给出了使用它的详细示例。

26

不要在使用tkinter的时候用time.sleep()。相反,应该在你想要关闭的组件上调用一个叫做after的函数。

下面是一个最简单的例子:

import tkinter as tk

w = tk.Tk()
w.after(30000, lambda: w.destroy()) # Destroy the widget after 30 seconds
w.mainloop()

撰写回答