执行时命令名称无效(“after”脚本)

Tin*_*nyT 8 python tkinter python-2.x

作为解决这个问题?我正在运行此代码,创建了窗口,但在控制台中出现有关错误的消息。我认为问题是“之后”循环没有终止但窗口已经被破坏了。

代码:

import Tkinter as tk
import time

class App():
    def __init__(self):
        self.root = tk.Tk()
        self.label = tk.Label(text="")
        self.label.pack()
        self.update_clock()
        self.root.mainloop()

    def update_clock(self):
        now = time.strftime("%H:%M:%S")
        self.label.configure(text=now)
        self.root.after(1000, self.update_clock)

app=App()
Run Code Online (Sandbox Code Playgroud)

控制台中的一条消息:

invalid command name "66120320callit"
while executing
"66120320callit"
("after" script)
Run Code Online (Sandbox Code Playgroud)

抱歉我在第一篇文章中提供了一些小信息。我正在使用 Spyder IDE,并且在间谍控制台中看到错误,其中重复运行我的代码。我在 python bug 跟踪器中找到的这个 bug 的描述为“wait_variable 在退出时挂起”

Bry*_*ley 9

如果您销毁窗口,则任何已安排的“之后”作业都可以运行。如果窗口被破坏并且此作业与已删除的小部件交互,您将收到此错误。

您可以try在代码周围放置一个并忽略此类错误,在尝试配置窗口之前检查窗口是否存在,或者在主窗口被销毁时放置一个处理程序以删除任何挂起的“之后”作业。

  • 如果你有一个手动退出按钮,你可以使用 `after_cancel()` 方法在调用 `root.destroy()` 来终止你的程序之前取消一个 `after` 方法。文档在这里:http://effbot.org/tkinterbook/widget.htm (7认同)
  • 上面的链接已失效。在回程机器上找到它:http://web.archive.org/web/20201112030233/http://effbot.org/tkinterbook/widget.htm (2认同)

Man*_*era 9

长话短说:使用tkinter.Tk.quit()

背景

我也遇到了这些“错误”。它们并不是真正的例外,它们只是在运行单元测试时在终端中看到垃圾邮件而令人烦恼。

我尝试了很多事情,包括重写after方法以tkinter.Tk跟踪任何排队的方法,然后tkinter.Tk.after_cancel()在调用之前自动调用tkinter.Tk.destroy(),如 @GabrielStaples 评论的那样。

after因此,即使在调用时没有排队方法,我也会收到这些错误destroy()

我的解决方案

对我有用的是调用tkinter.Tk.quit()销毁窗口而不是destroy(). 我读到这并quit()没有停止mainloop,但看起来还不错。任何排队的方法在after调用后都不会quit()被调用。

也许有人可以解释我不知道的任何后果(如果有的话)