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

问题描述 投票:2回答:1

我已经尝试了关闭我可以在互联网上找到的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搜索,并查看其他人的答案。

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

python tkinter
1个回答
4
投票

在您的代码中,您尝试在调用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()
© www.soinside.com 2019 - 2024. All rights reserved.