2014-10-17 77 views
0

我已經在這裏問過類似的問題,我收到了很有幫助的回覆。 但是從那以後我修改了我的代碼,現在它更加優化了,我想它應該更靈活,但同樣的問題仍然存在。我無法刪除該類的一個實例。刪除類的一個實例

我想要做的是創建一個圓(左鍵單擊),然後我希望程序刪除該圓(右鍵單擊)。

My code: 

from tkinter import * 

class Application: 
    def __init__(self): 
     self.fen = Tk() 
     self.fen.title('Rom-rom-roooooom') 
     self.butt1 = Button(self.fen, text = ' Quit ', command = self.fen.quit) 
     self.can1 = Canvas(self.fen, width = 300, height = 300, bg = 'ivory') 
     self.can1.grid(row = 1) 
     self.butt1.grid(row = 2) 
     self.fen.bind("<Button-1>", self.create_obj) 
     self.fen.bind("<Button-3>", self.delete_obj) 
     self.fen.mainloop() 
    def create_obj(self, event): 
     self.d = Oval() 
     self.can1.create_oval(self.d.x1, self.d.y1, self.d.x2, self.d.y2, fill='red', width = 2) 
    def delete_obj(self, event): 
     self.can1.delete(self.d) 


class Oval: 

    def __init__(self): 
     self.x1 = 50 
     self.y1 = 50 
     self.x2 = 70 
     self.y2 = 70 



appp = Application() 

所以,再一次,問題是,在這裏我不能刪除對象:

def delete_obj(self, event): 
     self.can1.delete(self.d) 

一個問題。鑑於我只是一個成員,我不知道我是否就班級組織而言選擇了正確的方法。它看起來像是一個組織良好的代碼,還是應該在這個階段改變任何東西?

+0

我明白了。我應該將創建圓的方法替換爲OVAL類嗎?然後從Application類引用它? – 2014-10-17 12:38:47

+0

我不明白你遵循什麼邏輯。您可以創建自己的類「Oval」的實例,並行地創建另一個tkinter對象。你從來沒有在'can1'上放置'self.d'。你需要什麼「橢圓形」? – luk32 2014-10-17 12:38:53

回答

1

這兩條線:

self.d = Oval() 
self.can1.create_oval(self.d.x1, self.d.y1, self.d.x2, self.d.y2, fill='red', width = 2) 

創建新Oval對象,該對象分配給名self.d,然後在self.can1創建橢圓即完全無關(除了具有相同的尺寸屬性)從Oval對象分配到self.d。相反,我想你想:

o = Oval() 
self.d = self.can1.create_oval(o.x1, o.y1, o.x2, o.y2, fill='red', width = 2) 

這將保留在Canvas一個參考對象,所以你就能delete它。請注意0​​或多或少是完全沒有意義的,因爲它所做的只是提供尺寸。

+0

如果你猜對了OP的意圖,我向你致敬。我仍然沒有看到橢圓形的目的,因爲它幾乎立即丟失了。至少它會明顯地工作=)。可能最明智的是延長或包裹tkinter的橢圓形,但選擇需要一個水晶球。 – luk32 2014-10-17 12:48:09

+0

@ luk32是的,'Oval'似乎完全存在以設置默認值(它們甚至不是默認參數),所以有點沒有意義。我會做得更清楚。 – jonrsharpe 2014-10-17 12:50:10

+0

謝謝,它現在有效。 現在我意識到這是一個相當不錯的錯,因爲函數創建的橢圓並沒有鏈接到任何變量,因此只要創建了這個對象,它就基本消失了。 如果我想控制行爲或類OVAL的實例,我應該總是有一個'對'對象?我的意思是像'o'和'self.d'。或者有辦法避免它? 我不熟悉這種面向對象的邏輯。 – 2014-10-19 20:47:58