为了账号安全,请及时绑定邮箱和手机立即绑定

在 tkinter python 中执行(“after”脚本)时如何处理无效命令名称错误

在 tkinter python 中执行(“after”脚本)时如何处理无效命令名称错误

富国沪深 2023-06-27 13:35:12
我知道这个问题已经在这里被多次提出,而且我已经仔细考虑过所有这些问题。但我没有找到解决该问题的明确方法。我知道发生这个错误的原因。我知道使用后root.destroy(),还有一些工作需要完成等等。但我想知道如何停止那些“之后”的工作?其中一个人要求在代码中使用try/ 。accept但他没有展示如何使用它。那么您能为这个案例提供一个明确的解决方案吗?有什么办法可以消除这个错误吗?我请求您不要将此问题标记为重复,也不要删除此问题。这很重要,而且我没有其他来源可以得到答案。invalid command name "2272867821888time"    while executing"2272867821888time"    ("after" script)
查看完整描述

1 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

在执行调度的回调之前销毁窗口时会发生此错误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')并返回 ids: 字符串'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()


查看完整回答
反对 回复 2023-06-27
  • 1 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信