【问题标题】:Exit a tkinter window after a certain time period?一段时间后退出 tkinter 窗口?
【发布时间】:2017-07-14 01:52:57
【问题描述】:

我已经尝试了各种方法来关闭我在互联网上可以找到的 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())”,然后,为了以防万一,我在创建了一个执行销毁命令的过程“window_closer()”之后尝试了“root.after(30000,window_closer)”。我假设这根本没有区别。真可惜,因为我成功了,这本来是理想的。

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

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

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

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

    您是正确的,您需要使用after 来安排销毁,并且您需要使用destroy 来进行销毁。关于after,要记住的重要一点是你必须给它一个函数的reference。如果您需要将参数传递给函数,可以在 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()
    

    【讨论】:

    • 我知道我不应该制作多余的 cmets,但非常感谢!这完全奏效了——我不敢相信我以前没有找到这个解释!我没有将其标记为“有用”的唯一原因是我只有 1 个声誉! + 1 反正!
    • 我一直在寻找一种跨平台的方法来测试我的代码是否在“无头”系统上运行,并且尝试这样做并且不捕获异常似乎是一个好方法。
    猜你喜欢
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    相关资源
    最近更新 更多