首页 > 解决方案 > 椭圆对象上的 Tkinter 画布绑定正在阻塞类析构函数

问题描述

我有一个类和对象Dot,它使用canvas.create_oval. 将点与按钮按下绑定到函数后,我无法再调用对象析构函数。因此,该行canvas.tag_bind(self.oval, '<ButtonPress-1>', self.do_popup)阻止调用析构函数,在注释掉该行后很容易重现。

我首先尝试解绑画布oval,然后调用析构函数,没关系我尝试解绑+删除画布对象然后调用析构函数,也没关系。我对 Python 还是比较陌生,但我习惯于用不同的语言编程。

import tkinter as tk

class Dot():
    def __init__(self, canvas):
       print('test init')
       self.canvas = canvas
       self.oval = canvas.create_oval(100, 100, 200, 200, fill= 'blue')
       #canvas.tag_bind(self.oval, '<ButtonPress-1>', self.do_popup)
       canvas.tag_bind(self.oval, '<ButtonPress-1>', self.do_popup)

    def __del__(self):
        print('dot del')

    def do_popup(self, event):
        print("popup")

root=tk.Tk()
mainFr = tk.Frame(root)
mainFr.pack(fill=tk.BOTH, expand = tk.YES)
canvas = tk.Canvas(mainFr, width = 400, height = 400, bg = "white")
canvas.pack(fill=tk.BOTH, expand = tk.YES)
test = Dot(canvas)
del test

所以删除第 9 行:canvas.tag_bind(self.oval, '<ButtonPress-1>', self.do_popup)'析构函数工作并被print('dot del')打印。在第 9 行,析构函数没有被调用,print('dot del')也没有被打印出来。有人可以帮助我做错了什么还是我滥用了析构函数?

标签: pythoncanvastkinterbinddestructor

解决方案


推荐阅读