【问题标题】:Automatically close window after a certain time一定时间后自动关闭窗口
【发布时间】:2013-03-09 01:44:51
【问题描述】:

在一个类中,在一个函数中,我正在创建一个 Tkinter 画布。这个函数正在被另一个类调用,我想让 Tkinter 窗口弹出 30 秒然后自行关闭。我叫它

master.mainloop()
time.sleep(30)
master.destroy() 

但我得到一个错误

"elf.tk.call('destroy', self._w) _tkinter.TclError:无法调用“destroy”命令:应用程序已被销毁”

那么我怎样才能让它自己关闭呢?

【问题讨论】:

  • 您需要一些关于运行带有事件循环的 GUI 意味着什么的教程,因为在您了解之前,您将不断遇到此类问题并且无法理解它们。 (抱歉,我没有推荐,但也许其他人会推荐。)值得注意的是,除了 GUI 应用程序之外,网络服务器和许多其他类型的程序也是围绕事件循环构建的,所以这是理解的非常关键的事情在玩具系统之外的编程领域。

标签: python tkinter


【解决方案1】:

不要将time.sleep() 与 tkinter 一起使用。相反,请在要关闭的小部件上调用函数 after

这是最简单的例子:

import tkinter as tk

w = tk.Tk()
w.after(30000, lambda: w.destroy()) # Destroy the widget after 30 seconds
w.mainloop()

【讨论】:

  • as tk 和 tk.Tk() 的意义是什么,只是重命名所以更容易写?
  • @EasilyBaffled 是的,import as 用于避免名称冲突,也可以使名称模块更短。我在 Tkinter 中经常使用它,但对于这个例子,from Tkinter import Tk 和使用 w = Tk() 也是有效的。
  • @EasilyBaffled:import Tkinter as tk 的另一个原因是,您只需将第一行更改为 import tinter as tk,即可将代码移植到 3.x,而无需更改引用模块的所有其他位置。
  • 我在 osx 上使用 python3.4 并且这不起作用,窗口不会自行销毁。
【解决方案2】:

这里的问题是 mainloop() 在 GUI 关闭之前不会返回。

因此, GUI 关闭并自行销毁 30 秒后,您尝试销毁它。显然这失败了。

但你不能只在主循环内移动sleepdestroy 调用,因为如果你在主循环中间sleep,GUI 将冻结。

因此,您需要某种不会停止主循环的计时器。 tkinter 包含 after 方法正是为了这个目的。 This answer 给出了详细的使用示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多