2013-03-09 74 views
4

在一个类中,在一个函数中我创建一个Tkinter画布。这个函数被另一个类调用,我想让Tkinter窗口弹出30秒,然后关闭它自己。我把它称之为一段时间后自动关闭窗口

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

但我得到一个错误

"elf.tk.call('destroy', self._w) _tkinter.TclError: can't invoke "destroy" command: application has been destroyed"

因此,如何能我把它关闭本身?

+1

你需要什么意思运行与事件循环GUI某种教程,因为直到你得到,你要继续运行陷入这样的问题而不理解它们。 (对不起,我没有推荐,但也许有人会这样做。)值得注意的是,网络服务器和除GUI应用以外的许多其他类型的程序也是围绕事件循环建立的,所以这是理解一个非常关键的事情在玩具系统之外的编程中。 – abarnert 2013-03-09 01:57:28

回答

12

请勿使用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() 
+0

作为tk和tk.Tk()的重要性是什么,只是重命名,所以它更容易写? – EasilyBaffled 2013-03-09 02:04:16

+0

@EasilyBaffled是的,['import as'](http://www.python.org/dev/peps/pep-0221/)用于避免名称冲突,并缩短名称模块。我在Tkinter中使用它非常多,但是对于这个例子'从Tkinter import Tk'并且使用'w = Tk()'也是有效的。 – 2013-03-09 02:16:30

+0

@SasilyBaffled:将Tkinter导入为tk的另一个原因是您可以将代码移植到3.x,只需将第一行更改为“import tinter as tk”,而无需更改引用模块的所有其他位置。 – abarnert 2013-03-09 02:21:22

4

这里的问题是mainloop()在GUI关闭之前不会返回。

因此,30秒图形用户界面已经关闭并摧毁自己,你试图摧毁它。显然这失败了。

但是,您不能在主循环内移动sleepdestroy调用,因为如果在主循环中间sleep,GUI将冻结。

所以,你需要某种不会停止主循环的计时器。 tkinter包含完全用于此目的的after方法。 This answer给出了一个使用它的详细例子。

相关问题