Python 尝试从Tkinter画布删除项目时出错

Python 尝试从Tkinter画布删除项目时出错,python,tkinter,Python,Tkinter,当我想要关闭应用程序时,我得到以下错误: Exception _tkinter.TclError: 'invalid command name ".47045488"' in <bound method RootJoint.__del__ of <skeleton.RootJoint object at 0x0000000002CDDBA8>> ignored 这是创建画布和根关节的地方: def main(): root = tk.Tk() root.

当我想要关闭应用程序时,我得到以下错误:

Exception _tkinter.TclError: 'invalid command name ".47045488"' in <bound method
RootJoint.__del__ of <skeleton.RootJoint object at 0x0000000002CDDBA8>> ignored
这是创建画布和根关节的地方:

def main():
    root = tk.Tk()
    root.geometry('640x480')

    canvas = tk.Canvas(root)
    canvas.pack(fill=tk.BOTH, expand=True)

    rootjoint = skeleton.RootJoint(canvas)

    root.mainloop()
为什么会出现此错误?我如何修复它?

问题在于

del

当对canves的最后一次引用丢失且对象被删除时调用

你想要的是

def __init__(...):
    ...
    self.bind("<Destroy>", self.onDestroy)
def onDestroy(self, event):
    self.canvas.delete(self._joint)
def\uuuu init\uuuuu(…):
...
self.bind(“,self.ondestory)
def onDestroy(自身、事件):
self.canvas.delete(self.\u关节)

首先,画布和所有元素将被销毁和销毁,然后被删除

'
整个画布被销毁还是当前对象被销毁时发出的事件?在执行过程中,我需要能够从屏幕上删除关节,所以这很重要。最后一次对画布的引用是如何丢失的?根关节有它自己对画布的引用。您总是可以删除这些项目,但在del中这样做太晚了:最后一次机会是OnDestroya在root.mainloop()之后添加del中的打印和main()中的打印,以查看何时执行。我猜del是在main()离开后被调用的。我试过了,这也不起作用。对
'
的回调仍然会在销毁后立即调用,而不是在销毁之前?是否有类似于
''
的事件?
def __init__(...):
    ...
    self.bind("<Destroy>", self.onDestroy)
def onDestroy(self, event):
    self.canvas.delete(self._joint)