1

我从类中删除画布对象时遇到问题。

我创建了一个Rectangle名为f. 然后我需要删除这个对象。Python 删除f,但不删除 Frame 上的画布对象。我不知道问题出在哪里。

from tkinter import *


class Rectangle():

    def __init__(self, coords, color):   
        self.coords = coords
        self.color = color   

    def __del__(self):
        print("In DELETE")
        del self
        print("Goodbye")

    def draw(self, canvas):
        """Draw the rectangle on a Tk Canvas."""
        print("In draw ")
        print("Canvas  =  ",canvas)
        print("self = ",self)
        print("bild canvas = ",canvas.create_rectangle(*self.coords, fill=self.color))


root = Tk()
root.title('Basic Tkinter straight line')
w = Canvas(root, width=500, height=500)

f = []
f = Rectangle((0+30*10, 0+30*10, 100+30*10, 100+30*10), "yellow")
print("Draw object", f.draw(w), f)
f.__del__()
del f

w.pack()
mainloop()
4

1 回答 1

1

好的,您遇到的问题是您开始创建一个Rectangle供您自己使用的对象,这似乎是合理的,但您需要努力实现它。

无论如何要简单地完成你想做的事情(没有你的对象):

# draws a rectangle and returns a integer
rectangle_id = c.create_rectangle(*(0, 0, 30, 30), fill="yellow")
c.delete(rectangle_id) # removes it from the canvas

为了用你的对象完成你想要的,Rectangle我建议在你绘制它时使用一个属性来存储 id 并实现一个可以删除它的方法。__del__当不再有对您的对象的任何引用时,您可能希望使用该方法将其删除。这可以做到,但你应该知道一些警告(在我的回答范围之外......见:http ://eli.thegreenplace.net/2009/06/12/safely-using-destructors-in-蟒蛇/)。我个人会选择显式调用一个方法来从视图中删除对象表示,以避免所有这些废话:)。

这里有很多设计决策我忽略了,我建议你在这里对 OO 的使用考虑一下,或者在你对 tkinter 有更好的理解之前避免使用它。

于 2012-12-31T18:25:04.257 回答