我已经尝试了关闭我可以在互联网上找到的tkinter窗口的各种方法。我问这个问题的唯一原因,即使已经被多次询问过,我仍然无法使其发挥作用。
基本上,我做了一个简单的倒计时'游戏(如电视节目),涉及30秒钟的大型计时器'计时器。该数字正确滴答,但程序不会继续,除非用户手动关闭窗口。很明显,这首先打败了计时器的目的,但是如何在我想要的时候让它自动关闭?
这是一个非常简单的例子:
# 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!
我尝试使用&#39;之后&#39;方法。首先我尝试了root.after(30000,destroy())&#39;然后,为了以防万一,我尝试了root.after(30000,window_closer)&#39;创建一个程序&#39; window_closer()&#39;那是毁灭命令。我假设完全没有任何区别。这是一种耻辱,因为我成功了,这本来是理想的。
我也试过创建一个框架然后“摧毁”#39;框架,但虽然它可能会禁用窗口小部件,但它实际上并不关闭窗口(如,关闭窗口)。当我尝试root.quit()&#39;时,什么都没发生。使用&#39; root.destroy()&#39;,我收到了错误消息&t; tkinter.TclError:无法调用&#34; destroy&#34;命令:应用程序已被销毁&#39;。显然这与mainloop()有关,但我不是真的得到它,尽管谷歌搜索它,并看着其他民族&#39;答案。
我错过了什么吗?任何帮助将不胜感激!
答案 0 :(得分:5)
在您的代码中,您在调用mainloop
后尝试运行代码。 mainloop
在窗口被销毁之前不会返回,因此修改窗口之后的任何尝试都将失败,并且&#34;应用程序已被销毁&#34;错误。
您是正确的,您需要使用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()