2013-07-16 5 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() 

создает кнопку и б удаляет его, но когда я призываю б он говорит: «Объект 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

В питона, если вы foo=a().b(), Foo задается значение b(). Итак, когда вы делаете self.call_button = Button(...).grid(...), self.call_button присваивается значение .grid(...), которое всегда None.

Если вы хотите сохранить ссылку на виджет, вам нужно отделить создание своего виджета от макета виджетов. Это хорошая привычка, потому что это концептуально две разные вещи. По моему опыту, макет может сильно измениться во время разработки, но используемые вами виджеты не так сильно меняются. Разделение их упрощает разработку. Кроме того, он откроет дверь позже, если вы решите предложить несколько макетов (например, навигацию слева, навигацию справа и т. Д.).

Смежные вопросы