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

问题描述 投票:0回答:4

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

代码:

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

控制台中的消息:

invalid command name "66120320callit"
while executing
"66120320callit"
("after" script)

抱歉我在第一篇文章中的小信息。我正在使用 Spyder IDE,并且在 spyder 控制台中看到错误,其中重复运行我的代码。我在 python 错误跟踪器中发现的这个错误描述为“wait_variable hangs at exit”

python tkinter python-2.x
4个回答
13
投票

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

您可以在代码周围放置一个

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


7
投票

TL;DR:使用

tkinter.Tk.quit()

背景

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

我尝试了很多东西,包括重写

after
中的
tkinter.Tk
方法以跟踪任何排队的方法,然后在调用
tkinter.Tk.after_cancel()
之前自动调用
tkinter.Tk.destroy()
,正如@GabrielStaples评论的那样。

所以我得到了这些错误,即使在调用

after
时没有排队的
destroy()
方法。

我的解决方案

对我有用的是调用

tkinter.Tk.quit()
而不是
destroy()
来破坏窗户。我读到
quit()
并没有阻止
mainloop
但它似乎很好。
after
排队的任何方法都不会在
quit()
被调用后被调用。

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


0
投票

我遇到这个问题是因为我的模块被命名为“setup”并且我还有一个 setup.py 文件。当调用 setup.py somecommand 时,你会得到“invalid command name 'somecommand'”。


0
投票

我遇到了这个问题,并通过使用普通 Python 的

exit()
而不是 Tkinter 的
root.destroy()
tkinter.Tk.quit()
来解决。

© www.soinside.com 2019 - 2024. All rights reserved.