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