2017-05-04 2 views
1

아래 실험에서 Button1을 누르면 태그 상자 레이블이 나타나야합니다. 그러나 Button2에 대한 언론에 따라이를 수행하면 사라지는 함수의 delete 명령에서 문제를 참조한 다음 tk 모듈의 "태그 검색 표현식에서 잘못된 부울 연산자"를 참조하는 중 오류가 발생합니다.Python Tkinter canvas.delete failure

from tkinter import * 
from tkinter import ttk 

class MainWindow(Frame): 
    def __init__(self,master): 
     super().__init__() 
     self.pack(fill=Y, side=LEFT) 
     self.booking_canvas = Canvas(self, width=400, 
     height=100,background="red") 
     self.button1 = Button(self.booking_canvas, text = "Appear", command = 
     self.appear) 
     self.button2 = Button(self.booking_canvas, text="Disappear", 
     command=self.disappear) 
     self.booking_canvas.create_window(20,10,window = self.button1) 
     self.booking_canvas.create_window(80, 10, window=self.button2) 
     self.booking_canvas.pack(side=LEFT) 

    def appear(self): 
     self.tagbox = Label(self.booking_canvas,text="Hello") 
     self.booking_canvas.create_window(200,10,window = self.tagbox, anchor 
     = NW) 

    def disappear(self): 
     self.booking_canvas.delete(self.tagbox) 

root = Tk() 
MainWindow(root) 
root.mainloop() 

도와 주실 수 있습니까? 나는 오류 메시지를 아주 잘 모르겠다. 나는 문서에서 찾은 간단한 예제에서 .delete 메소드가 작동하도록 만들었지 만, 여기서는 그렇지 않다.

+0

질문에 실제 오류를 넣으십시오. 또한 delete 메소드의 첫 번째 인수는 태그 또는 ID 여야하지만 위젯에 대한 참조를 전달하고 있어야합니다. –

+0

나는 여전히 프로토콜을 배우는 파이썬 초보자입니다. 콜백 전체를 포함해야합니까? 그들은 꽤 길어질 수 있습니다. @falsetru가 지적한 것과 같은 해결책에 감사드립니다. – user3474688

답변

1

코드는 create_window() 호출의 반환 값을 기억해야합니다. 그런 다음 Canvas.delete 방법으로 전달하십시오.

def __init__(self, master): 
    ... 
    self.item = None 

def appear(self): 
    self.tagbox = Label(self.booking_canvas,text="Hello") 
    self.disappear() # remove old one 
    self.item = self.booking_canvas.create_window(200, 10, 
     window=self.tagbox, anchor=NW) 

def disappear(self): 
    if self.item: 
     self.booking_canvas.delete(self.item)