【问题标题】:How to handle Invalid command name error, while executing ("after" script) in tkinter python如何在 tkinter python 中执行(“之后”脚本)时处理无效命令名错误
【发布时间】:2020-12-17 01:54:54
【问题描述】:

我知道这个问题已经在这里提出过多次,并且我已经解决了所有问题。但我没有找到一个明确的解决方案。我知道发生此错误的原因。我知道在使用root.destroy() 之后,还有一些工作需要完成等等。 但我想知道如何停止那些“后”工作? 其中一个人要求在代码中使用try/accept。但他没有展示如何使用它。 那么您能否针对这种情况给出一个明确的解决方案?有没有办法消除这个错误? 我要求您不要将此问题标记为重复,也请不要删除此问题。这很重要,我没有其他来源可以得到答案。

invalid command name "2272867821888time"
    while executing
"2272867821888time"
    ("after" script)

【问题讨论】:

  • 我可以尝试解决这个问题,但只有当我有东西可以使用时,所以如果你能提供一个代码的 sn-p 以便我可以尝试在这里重现这个问题会更好。也可以使用 try/except 块来处理任何错误。因此,如果您想知道如何使用 try/except(虽然我不认为是这种情况),(但如果是这种情况,这里是如何使用 try/except):try: somethingHere() root.destroy( ) somethingHereAsWell() except: pass 注意我使用了一个宽泛的例外条款来处理所有可能的问题。

标签: python python-3.x tkinter error-handling destroy


【解决方案1】:

在使用after 安排的回调执行之前销毁窗口时会发生此错误。为避免此类问题,您可以存储调度回调时返回的 id,并在销毁窗口时取消它,例如使用protocol('WM_DELETE_WINDOW', quit_function)

这是一个例子:

import tkinter as tk

def callback():
    global after_id
    var.set(var.get() + 1)
    after_id = root.after(500, callback)

def quit():
    """Cancel all scheduled callbacks and quit."""
    root.after_cancel(after_id)
    root.destroy()

root = tk.Tk()
root.pack_propagate(False)
var = tk.IntVar()
tk.Label(root, textvariable=var).pack()
callback()
root.protocol('WM_DELETE_WINDOW', quit)
root.mainloop()

另外,Tcl/Tk 有一个 after info 方法,它不能通过 python 包装器直接访问,但可以使用 root.tk.eval('after info') 调用并返回一个 id 字符串:'id1 id2 id3'。因此,跟踪所有 id 的另一种方法是使用这个:

import tkinter as tk

def callback():
    var.set(var.get() + 1)
    root.after(500, callback)

def quit():
    """Cancel all scheduled callbacks and quit."""
    for after_id in root.tk.eval('after info').split():
        root.after_cancel(after_id)
    root.destroy()

root = tk.Tk()
root.pack_propagate(False)
var = tk.IntVar()
tk.Label(root, textvariable=var).pack()
callback()
root.protocol('WM_DELETE_WINDOW', quit)
root.mainloop()

【讨论】:

  • 如果我使用“after info”方法即root.tk.eval('after info'),那还需要“callback”函数和“root.protocol”方法吗?跨度>
  • @AdnanAkram 我已经为第二种情况提供了一个完整的示例。 callback() 只是重复使用.after 的一个例子,不再需要的是after_id 变量,即您不需要存储您安排的所有回调的ID。 root.protocol 总是需要的,因为它是您使用 quit() 函数覆盖关闭窗口的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
相关资源
最近更新 更多