【问题标题】:Cannot populate radio button correctly - Tkinter无法正确填充单选按钮 - Tkinter
【发布时间】:2016-12-25 05:30:45
【问题描述】:

我正在尝试使用 Tkinter 做一些事情作为练习。 在我的示例应用程序中,我希望用户从下拉列表中选择一个选项。基于此选择,我想填充单选按钮列表。我创建了一个要填充到下拉列表中的值列表和一个单选按钮字典。请检查代码。

请参阅下面的一些有效和无效示例:

从图片中可以看出。第一个窗口运行良好。二也。然而,第三个窗口并不完全正确。选项“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()

【问题讨论】:

  • 删除旧的,重新创建。

标签: python-2.7 tkinter radio-button


【解决方案1】:

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

这是一个保留引用的示例:

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

【讨论】:

  • 是的。我正在寻找一些方法来删除或替换旧的。这样可行。谢谢!
猜你喜欢
  • 2022-01-17
  • 2013-05-01
  • 2014-03-01
  • 2021-12-24
  • 2011-12-25
  • 2021-07-28
  • 2020-10-27
  • 1970-01-01
相关资源
最近更新 更多