在一段时间后退出tkinter窗口?

时间:2017-02-23 14:12:47

标签: python tkinter

我已经尝试了关闭我可以在互联网上找到的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;答案。

我错过了什么吗?任何帮助将不胜感激!

1 个答案:

答案 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()