2012-12-31 54 views
1

從類中刪除畫布對象時出現問題。從類中刪除畫布對象的問題

我創建了一個名爲f的類型爲Rectangle的對象。然後我需要刪除這個對象。 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() 
+0

畫布對象被分配給引用w。那是你想要刪除的嗎? –

+0

是的,如果我做w.delete(f)什麼都沒發生 – user1939965

回答

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-python/)。我個人會選擇顯式調用一個方法從視圖中刪除對象表示,以避免所有的廢話:)。

這裏有很多設計決定,我忽略了,我建議你在這裏使用OO,或者避免它,直到你對tkinter有更好的理解。

+0

我在類Rectangle中創建了一個self.rectangle_id,問題消失了,非常感謝,新年快樂 – user1939965