当前位置: 首页 > 知识库问答 >
问题:

在特定时间段后退出tkinter窗口?

殳俊晤
2023-03-14

我尝试了各种方法来关闭我在互联网上可以找到的html" target="_blank">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!

我试着使用“之后”方法。首先,我尝试了root.after(30000,销毁()),然后,为了以防万一,我尝试了root.after(30000,window_closer),在创建了一个执行销毁命令的过程window_closer()之后。我想这没什么区别。这是一个耻辱,因为我已经成功了,这是理想的。

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

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

共有1个答案

瞿博易
2023-03-14

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

您正确地认为需要在之后使用来安排销毁,并且需要使用销毁来导致销毁。关于之后的要记住的重要一点是,必须给它一个函数的引用。如果需要将参数传递给函数,可以在调用后的中将这些参数指定为附加参数。

换言之:

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

 类似资料:
  • 我正在开发一个GUI,它允许用户决定是继续执行脚本还是终止脚本,但如果用户在15分钟内没有响应,我希望关闭窗口并自动执行脚本的其余部分。我用过根。函数中的destroy(),但它仅在用户响应时执行。 我尝试过在试用的基础上使用倒计时功能,但它不起作用,因为没有用户响应控制就不会进入倒计时功能。我有什么办法能完成这项任务吗?

  • 我写了一个小GUI程序与python在tkinter的窗口。我的窗口必须在全屏游戏窗口的前面。 此刻,我用这句话: 它适用于普通窗口(浏览器,浏览器,...),但如果我启动游戏到全屏模式,我的窗口隐藏在游戏后面。 为什么会发生这种情况?调用游戏可能类似于覆盖我的属性的? 我的问题还有别的解决办法吗?也许可以告诉windows,我的窗口应该在特定窗口(游戏窗口)的前面?

  • 在一个类中,在一个函数中,我创建了一个Tkinter画布。这个函数正在被另一个类调用,我希望Tkinter窗口弹出30秒,然后自动关闭。我有电话 但我犯了个错误 elf.tk.call('destroy',self.w)\u tkinter.TclError:无法调用“destroy”命令:应用程序已被销毁 那我怎么能让它自己关上呢?

  • 在这个新窗口中,我找不到一种方法来确保打印标签,或者实际播放游戏是在my_window中完成的?? 在下面的代码中,我用函数launch_the_game中的标签(label(my_window,text=“game_num value”+str(game_num)).grid(行=5,列=0)来模拟它。这个标签是在root中打印的,而不是在my_window中打印的,这是怎么回事呢? 我不是在叫

  • 我有一个微服务,它会收到一条消息,大概是这样的: 是否有任何开箱即用的解决方案允许方法每天在给定时间运行?使用 Spring 中的 cron 不涉及在运行时更改时间。我需要使用更灵活的选项(更改运行时,多次启动) 谢谢!

  • 问题内容: 我有一个主Frame(称为)和一个弹出式Toplevel(称为)。如何确保用户在“处于活动状态”时无法单击任何内容? 问题答案: 如果您不想隐藏根目录,而只是确保用户只能与弹出窗口进行交互,则可以使用和。 或者 ,您可以使它不可见的根源: 将保留根,但仅可见。 如果您需要它,可以做