2016-08-18 40 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