2016-08-18 10 views
0

Я пытаюсь сделать несколько вещей с Tkinter как упражнение. В моем примере приложения я хочу, чтобы пользователь мог выбрать один из выпадающего списка. Основываясь на этом выборе, я хочу заполнить список переключателей. Я создал список значений для заполнения в выпадающем списке и словарь для переключателя. проверьте код.Невозможно заполнить радиокнопку правильно - Tkinter

Ниже некоторые рабочие примеры работы, а не: enter image description here

Как вы можете видеть на картинке. Первое окно работает хорошо. Второе. Однако третье окно не совсем корректно. Опция «410» остается. Я делаю последующие выборы, не закрывая приложение.

Я думаю, что, возможно, я не объявляю переменные в нужном месте. Было бы очень полезно, если бы кто-то мог взглянуть на код и исправить его.

Код:

from Tkinter import * 
    import ttk 


    class App(Frame): 

     def __init__(self,parent): 
      Frame.__init__(self) 
      self.parent = parent 
      self.v = IntVar() 
      #self.radio_value = [] 
      #self.i = 0 
      self.GUI() 


     def GUI(self): 

      self.master.title('Example') 
      self.pack(fill = BOTH, expand = 1) 
      self.options = ['a1','a2','a3','a4','a5'] 
      self.box_value = StringVar() 
      self.box = ttk.Combobox(self, textvariable=self.box_value) 
      self.box.bind("<<ComboboxSelected>>", self.set_Radio) 
      self.box['values'] = self.options 
      self.box.current(0) 
      self.box.grid(row = 0, column = 0 ) 

      self.choices = {'a1':['30', '70', '140', '410'], 'a2': ['a', 'b', 'c'], 'a3': ['x', 'y', 'z'], 'a4':['p', 'q', 'r'], 'a5': ['l', 'm', 'n']} 

     def set_Radio(self,parent): 

      i = 0 
      radio_value = [] 
      if self.box_value.get() in self.choices.keys(): 
       radio_value = self.choices[self.box_value.get()] 
      print radio_value 

      for t in radio_value: 
       i = i+1 
       b = Radiobutton(self, text=t, variable=self.v, value=t) 
       b.grid(row = i, column = 0) 

    def main(): 
     root = Tk() 
     root.geometry('250x250') 
     app1= App(root) 
     root.mainloop() 


    if __name__ == '__main__': 
     main() 
+0

Удалить старые, воссоздать. –

ответ

2

Проблема заключается в том, что вы не удалите старые радиокнопки перед созданием новых радиокнопки. Одно из решений - положить их в невидимую рамку. Когда вы удаляете фрейм, радиообъекты будут автоматически уничтожены. Другим решением является сохранение ссылки на них, чтобы вы могли уничтожить их по отдельности позже.

Вот пример сохранения ссылки:

def __init-_(self, parent): 
    ... 
    self.radios = [] 

def set_Radio(self,parent): 
    for widget in self.radios: 
     widget.destroy() 
    self.radios = [] 
    ... 
    for t in radio_value: 
     ... 
     b = Radiobutton(...) 
     self.radios.append(b) 
     ... 
+0

Да. Я искал способ удалить или заменить старые. это работает. Благодаря ! – Jio

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