2014-10-17 4 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 클래스에서 참조하십시오. –

+0

나는 당신이 따르는 논리를 이해하지 못합니다. 당신 자신의 클래스'타원형'의 인스턴스를 만들고, 또 다른 tkinter 객체를 생성합니다. 당신은 결코'can1' 위에'self.d'를 놓지 않았습니다. '타원형'은 무엇을 필요로합니까? – luk32

답변

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에 할당되었습니다. 대신, 나는 당신이 원하는 생각 : 당신이 그것을 delete 할 수 있도록

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

이는 Canvas에 개체에 대한 참조를 유지합니다. Oval은 크기를 제공하는 것보다 더 많거나 적은 완전히 무의미합니다.

+0

OP의 의도가 맞다면 경례를드립니다. 나는 타원형의 목적을 거의 보지 못했는데, 거의 즉시 사라졌다. 적어도 지금은 눈에 띄게 작동합니다 =). 아마도 가장 현명한 것은 tkinter의 타원을 확장하거나 감싸는 것입니다.하지만 크리스탈 볼을 선택해야합니다. – luk32

+0

@ luk32 예, '타원형'은 기본 값을 설정하는 것으로 완전히 존재하는 것 같습니다 (기본값은 아닙니다). 그래서 약간 무의미합니다. 나는 그것을 더 명확하게 할 것이다. – jonrsharpe

+0

감사합니다. 지금 작동합니다. 이제 함수에 의해 생성 된 타원이 변수에 연결되지 않았으므로 결과적으로이 객체가 생성되자 마자 기본적으로 사라 졌기 때문에 다소 노비가 잘못되었음을 알았습니다. 클래스 또는 OVAL 클래스의 인스턴스를 제어하려는 경우 항상 '쌍'객체가 있어야합니까? 나는 'o'와 'self.d'를 의미합니다. 또는 그것을 피할 수있는 방법이 있습니까? 저는이 객체 지향 논리를 처음 사용합니다. 미안합니다. –