Python tkinter-如何使用字典创建两个链接的组合框
目标:两个链接的组合框,一个显示字典键。另一个显示选定关键点的值 我已经用字典键的值填充了第一个组合框,并将其转换为一个列表,以便在组合框中很好地显示。 已设置默认值,用于收集第二个组合框所需的数据。这里一切都很顺利,我遇到的问题是如何更新 更改第一个组合框当前值时,第二个组合框中的值 迄今为止的代码Python tkinter-如何使用字典创建两个链接的组合框,python,tkinter,combobox,Python,Tkinter,Combobox,目标:两个链接的组合框,一个显示字典键。另一个显示选定关键点的值 我已经用字典键的值填充了第一个组合框,并将其转换为一个列表,以便在组合框中很好地显示。 已设置默认值,用于收集第二个组合框所需的数据。这里一切都很顺利,我遇到的问题是如何更新 更改第一个组合框当前值时,第二个组合框中的值 迄今为止的代码 from tkinter import Tk, StringVar, ttk dict_values = { "Beer": ["Ale", &q
from tkinter import Tk, StringVar, ttk
dict_values = {
"Beer": ["Ale", "Lager", "Stout"],
"Spirits": ["Brandy", "Gin", "Rum"],
"Wine": ["White","Red","Rose"]
}
#convert keys to list for displaying in the first combobox
box1= []
for key in dict_values:
box1.append(key)
from tkinter import Tk, StringVar, ttk
class Application:
def __init__(self, parent):
self.parent = parent
self.combo()
def combo(self):
#First Combobox
self.box_value = StringVar()
self.box = ttk.Combobox(self.parent, textvariable=self.box_value,
state='readonly')
self.box['values'] = box1
self.box.current(0)
self.box.grid(column=0, row=0)
#Second Combobox
self.box_value2 = StringVar()
self.box2 = ttk.Combobox(self.parent, textvariable=self.box_value2,
state='readonly')
self.box2['values'] = dict_values[self.box.get()]
self.box2.grid(column=1, row=0)
if __name__ == '__main__':
root = Tk()
root.minsize(800, 600)
app = Application(root)
root.mainloop()
代码缺少将
事件绑定到在self.box中进行选择时将执行的回调的绑定
所以加上
self.box.bind(“,self.selected)
请注意,self.selected
是您必须实现的新方法,下面是一个示例
def选择(self,e):
#打印('selected value->',self.box.get(),self.box\u value.get())
self.box.2.configure(value=dict_values[self.box_value.get())
self.box2.电流(0)
完整代码
#
从tkinter导入Tk、StringVar、ttk
dict_值={
“啤酒”:[“淡啤酒”、“啤酒”、“烈性啤酒”],
“烈酒”:[“白兰地”、“杜松子酒”、“朗姆酒”],
“葡萄酒”:[“白”、“红”、“玫瑰”]
}
#将键转换为列表以显示在第一个组合框中
框1=[]
对于输入的dict_值:
框1.追加(键)
从tkinter导入Tk、StringVar、ttk
班级申请:
定义初始化(自身,父级):
self.parent=parent
self.combo()
#修改2
已选择def(自我,e):
#打印('selected value->',self.box.get(),self.box\u value.get())
self.box.2.configure(value=dict_values[self.box_value.get())
self.box2.电流(0)
def组合(自我):
#第一个组合框
self.box_value=StringVar()
self.box=ttk.Combobox(self.parent,textvariable=self.box\u值,
state='readonly')
#修改1
self.box.bind(“,self.selected)
self.box['values']=box1
自盒电流(0)
self.box.grid(列=0,行=0)
#第二个组合框
self.box_value2=StringVar()
self.box2=ttk.Combobox(self.parent,textvariable=self.box_value2,
state='readonly')
self.box 2['values']=dict_值[self.box.get()]
self.box2.grid(列=1,行=0)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
root=Tk()
root.minsize(800600)
app=应用程序(根)
root.mainloop()
您可以使用验证
和验证命令
来完成此操作。无需向组合框添加bind
<如果validate
设置为“全部”
或“焦点”
,则每次单击组合框时,code>validatecommand
都将运行
StringVar
是不必要的开销,文档的结构有点奇怪。下面的示例解决了这些问题,并为您的问题提供了解决方案
from tkinter import Tk
from tkinter.ttk import Combobox
class Application(Tk):
def __init__(self, *args, **kwargs):
Tk.__init__(self, *args, **kwargs)
self.options = {
"Beer": ["Ale", "Lager", "Stout"],
"Spirits": ["Brandy", "Gin", "Rum"],
"Wine": ["White","Red","Rose"]
}
#delegate between init and config so the Combobox kwargs are not a mile long
self.cb1 = Combobox(self, state="readonly", values=[*self.options])
self.cb1.config(validate="focus", validatecommand=self.populate_slave)
self.cb1.current(0)
self.cb1.grid(column=0, row=0)
self.cb2 = Combobox(self, state="readonly")
self.cb2.grid(column=1, row=0)
#manually run the validatecommand function once to init cb2 items
#this way it will always be correct regardless of the item you start cb1 with
self.populate_slave()
def populate_slave(self):
self.cb2['values'] = self.options[self.cb1.get()]
self.cb2.current(0)
return True #must return True or validatecommand will quit
if __name__ == "__main__":
app = Application()
app.minsize(800, 600)
app.title('My Application')
app.mainloop()
谢谢,太棒了!我会读一些关于谢谢你的文章。我将把它用作优化代码的研究