如何解决这个问题?我正在运行此代码,创建了窗口,但在控制台中出现了有关错误的消息。我认为问题是“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”
如果你销毁窗口,任何已经安排的“之后”的工作都可以运行。如果窗口被销毁并且此作业与已删除的小部件交互,您将收到此错误。
您可以在代码周围放置一个
try
并忽略此类错误,在尝试配置窗口之前检查该窗口是否存在,或者在主窗口被销毁时放置一个处理程序以删除任何挂起的“之后”作业。
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()
被调用后被调用。
也许有人可以解释我不知道的任何后果
我遇到这个问题是因为我的模块被命名为“setup”并且我还有一个 setup.py 文件。当调用 setup.py somecommand 时,你会得到“invalid command name 'somecommand'”。
我遇到了这个问题,并通过使用普通 Python 的
exit()
而不是 Tkinter 的root.destroy()
或 tkinter.Tk.quit()
来解决。