我已经尝试了关闭我可以在互联网上找到的tkinter窗口的各种方法。我问这个问题的唯一原因,即使已经被多次询问过,我仍然无法使其发挥作用。
基本上,我正在制作一个简单的“倒计时”游戏(就像电视节目一样),它涉及一个30秒的大型tkinter'计时器'。该数字正确滴答,但除非用户手动关闭窗口,否则程序将不会继续。很明显,这首先打败了计时器的目的,但是如何在我想要的时候让它自动关闭?
这是一个非常简单的例子:
# python 3.5.2
from tkinter import *
root = Tk()
root.title("Test")
root.mainloop()
# root.destroy() / root.quit() <== neither of these are effective
print("The window has now been closed") ## not unless the user crosses it off!
我尝试使用'after'方法。首先我试过'root.after(30000,destroy())'然后,为了以防万一,我在创建了一个执行destroy命令的'window_closer()'程序之后尝试了'root.after(30000,window_closer)'。我假设完全没有任何区别。这是一种耻辱,因为我成功了,这本来是理想的。
我也尝试创建一个框架,然后“销毁”框架,但是虽然它可能会禁用小部件,但它实际上并不关闭窗口(如,关闭它)。当我尝试'root.quit()'时,什么都没发生。使用'root.destroy()',我收到错误消息'tkinter.TclError:无法调用“destroy”命令:应用程序已被销毁'。显然这与mainloop()有关,但我不是真的得到它,尽管用Google搜索,并查看其他人的答案。
我错过了什么吗?任何帮助将非常感激!
在您的代码中,您尝试在调用mainloop
后运行代码。 mainloop
在窗口被销毁之前不会返回,因此修改窗口之后的任何尝试都将失败并显示“应用程序已被破坏”错误。
你是正确的,你需要使用after
来安排销毁,你需要使用destroy
来导致破坏。关于after
要记住的重要一点是你必须给它一个函数的引用。如果需要将参数传递给函数,可以在after
调用中将这些参数指定为附加参数。
换一种说法:
root.after(1000, root.destroy())
与此完全相同:
result = root.destroy()
root.after(1000, result)
相反,你需要在没有括号的情况下调用destroy
。在绝对最简单的情况下,您的程序将如下所示:
import tkinter as tk
root = tk.Tk()
root.after(10000, root.destroy)
root.mainloop()
如果您想更新倒计时时钟,您可以每秒调用自己的功能,并在倒计时结束时销毁窗口。
这是一个例子:
import tkinter as tk
def countdown(time):
if time == -1:
root.destroy()
else:
if time == 0:
label.configure(text="BOOM")
else:
label.configure(text="time remaining: %d seconds" % time)
root.after(1000, countdown, time-1)
root = tk.Tk()
label = tk.Label(root, width=30)
label.pack(padx=20, pady=20)
countdown(10)
root.mainloop()