2013-03-27 3 views
2

Вчера я задал этот вопрос Creating elements by loop Tkinter, чтобы узнать, как динамически создавать пулевые точки. Теперь я хочу добавить четкую кнопку, поэтому при нажатии, сбросит всю форму. Я попытался установить список обратно на [], но он не сработал.Tkinter - Как я могу сбрасывать список объектов?

Редактировать - Так что, когда я нажимаю кнопку сброса, мне бы хотелось, чтобы он выглядел так же, как при загрузке формы.

ответ

4

Кнопки удаляются с помощью метода destroy:

for button in self.button: 
     button.destroy() 

import Tkinter as tk 

class ButtonBlock(object): 
    def __init__(self, master): 
     self.master = master 
     self.button = [] 
     self.button_val = tk.IntVar() 
     entry = tk.Entry() 
     entry.grid(row=0, column=0) 
     entry.bind('<Return>', self.onEnter) 
     entry.focus() 
     clear_button = tk.Button(master, text='Clear', command=self.onClear) 
     clear_button.grid(row=0, column=1) 
    def onClear(self): 
     for button in self.button: 
      button.destroy() 
    def onEnter(self, event): 
     entry = event.widget 
     num = int(entry.get()) 
     self.onClear() 
     for i in range(1, num+1): 
      self.button.append(tk.Radiobutton(
       self.master, text=str(i), variable=self.button_val, value=i, 
       command=self.onSelect)) 
      self.button[-1].grid(sticky='WENS', row=i, column=0, padx=1, pady=1) 
    def onSelect(self): 
     print(self.button_val.get()) 

if __name__ == '__main__': 
    root = tk.Tk() 
    ButtonBlock(root) 
    root.mainloop() 
+0

Это сработало очарование, спасибо. – Arktri

2

Установка списка назад (то есть с помощью self.button = []) только очищает данные, хранящиеся в переменной button. Только это действие не связано с пользовательским интерфейсом (UI). Вы должны явно удалить объекты виджета, которые были созданы (методом onEnter).

Таким образом, функция очистки, которую вы ищете, должна быть осуществима путем расширения answer от вашего предыдущего вопроса. Добавьте метод onClear к классу ButtonBlock, так что, когда ваш элемент управления «Очистить» (то есть с помощью виджета кнопки) выбран, его функция обратного вызова вызывает ButtonBlock.onClear(), подобно тому, как ваш виджет Entry вызывает метод onEnter.

EDIT: См. Ответ unutbu на этот вопрос. Когда выбрано, управление clear_button вызывает ButtonBlock.onClear(). Цикл for в onClear получает ссылку на каждую кнопку ojbect из списка button и вызывает метод destroy объекта, который удаляет его из пользовательского интерфейса.

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