Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tkinter-如何使用字典创建两个链接的组合框_Python_Tkinter_Combobox - Fatal编程技术网

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

谢谢,太棒了!我会读一些关于谢谢你的文章。我将把它用作优化代码的研究