一定时间后退出tkinter窗口?

Par*_*gar 4 python tkinter

我已经尝试过各种方法来关闭可以在互联网上找到的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!
Run Code Online (Sandbox Code Playgroud)

我尝试使用“之后”方法。首先,我创建了执行销毁命令的过程“ window_closer()”之后,尝试了“ root.after(30000,destroy())”,然后以防万一,我尝试了“ root.after(30000,window_closer)”。我以为那没有任何区别。真可惜,因为我成功了,那真是太理想了。

我还尝试创建一个框架,然后“销毁”该框架,但是尽管它可能会禁用小部件,但实际上并没有关闭窗口(例如,将其划掉)。当我尝试'root.quit()'时,什么也没发生。使用“ root.destroy()”,我收到错误消息“ tkinter.TclError:无法调用“ destroy”命令:应用程序已被破坏”。显然,这与mainloop()有关,但是尽管谷歌搜索了它,并查看了其他人的答案,但我并没有真正得到它。

我想念什么吗?任何帮助将非常感激!

Bry*_*ley 6

在您的代码中,您尝试在调用后运行代码mainloopmainloop在窗口被销毁之前不会返回,因此在此之后修改窗口的任何尝试都会失败,并显示“应用程序已被销毁”错误。

您是正确的,您需要使用它after来计划销毁,并且需要使用它destroy来造成销毁。要记住的重要事情after是必须给它提供函数的引用。如果需要将参数传递给函数,则可以在after调用中将其指定为其他参数。

换一种说法:

root.after(1000, root.destroy())
Run Code Online (Sandbox Code Playgroud)

与此完全相同:

result = root.destroy()
root.after(1000, result)
Run Code Online (Sandbox Code Playgroud)

相反,您需要destroy 不带括号通过。在绝对最简单的情况下,您的程序将如下所示:

import tkinter as tk

root = tk.Tk()
root.after(10000, root.destroy)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)

如果要更新倒数时钟,可以每秒调用自己的函数,并在倒数计时结束时销毁窗口。

这是一个例子:

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()
Run Code Online (Sandbox Code Playgroud)

  • 我知道我不应该发表多余的评论,但是非常感谢!这完全可行-我不敢相信我以前没有找到这个解释!我没有将其标记为“有用”的唯一原因是,我只有1个声誉!反正+1! (2认同)