2017-05-04 227 views
1

在下面的實驗中,當我按下Button1時,tagbox Label應該出現,並且它會出現。但是如果我在Button2上按下按鈕,我會在引用消失函數的delete命令中的一個問題時出現錯誤,然後在tk模塊中引用「標記搜索表達式中的」無效布爾運算符「。Python Tkinter canvas.delete失敗

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() 

你能幫忙嗎?我找不到錯誤消息非常helfpul。我已經能夠通過我在文檔中找到的簡單示例使.delete方法工作,但不在這裏。

+0

請在您的問題中包含實際錯誤。此外,刪除方法的第一個參數必須是標籤或標識,但是您傳遞的是對小部件的引用。 –

+0

我是一個Python新手,仍然學習協議。我應該包括整個回調?他們可能會很長。感謝您的解決方案,與@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)