2013-07-16 63 views
0

我試圖創建一個函數,在屏幕上創建並放置一個按鈕(帶有網格),並且該按鈕的命令將自行移除(或任何其他窗口小部件),但我失敗了這樣做。Tkinter從正在運行的程序中刪除一個按鈕

def a(self): 
    self.call_button = Tkinter.Button(self.root, text = "Call", command=self.b).grid(row = 5, column = 5) 

def b(self): 
    self.call_button.destroy() 

一個創建按鈕和b刪除它,但是當我第B它說叫「NoneType對象沒有屬性破壞」

如何去正確地這樣做呢?

回答

5

self.call_button設置爲grid(row=5, column=5)的結果,而不是..按鈕

from tkinter import * 
class App(Frame): 
    def __init__(self, master): 
     Frame.__init__(self, master) 
     self.grid() 
     self.a() 

    def a(self): 
     self.call_button = Button(self, text = "Call", command=self.b) 
     self.call_button.grid(row=5, column=5) # This is fixing your issue 

    def b(self): 
     self.call_button.destroy() 

root = Tk() 
app = App(master=root) 
app.mainloop() 
1

在Python中,如果你這樣做foo=a().b(),FOO給出的b()值。因此,當您執行self.call_button = Button(...).grid(...)時,self.call_button的值爲.grid(...),始終爲None

如果您想保留對小部件的引用,則需要將小部件創建與小部件佈局分開。這是一個很好的習慣,因爲無論如何,這些概念上是兩回事。根據我的經驗,佈局在開發過程中可能會發生很大變化,但我使用的小部件並沒有太大改變。分離它們使開發更容易。此外,如果您決定提供多種佈局(例如:左側導航,右側導航等),它將在稍後打開大門。

相關問題