无法正确填充单选按钮 - Tkinter

时间:2016-08-18 10:15:13

标签: python-2.7 tkinter radio-button

我正在尝试使用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()

1 个答案:

答案 0 :(得分:2)

问题是在创建新的radiobuttons之前,你不能删除旧的radiobuttons。一种解决方案是将它们放在一个看不见的框架中。删除框架时,radiobuttons将自动销毁。另一种解决方案是保留对它们的引用,以便以后可以单独销毁它们。

以下是保留参考的示例:

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)
        ...