如何在python中使用Tkinter生成3(或4)个嵌套的绑定组合?

如何在python中使用Tkinter生成3(或4)个嵌套的绑定组合?,python,tkinter,combobox,Python,Tkinter,Combobox,我正在尝试制作一个GUI,它具有依赖于上一个下拉列表的绑定下拉列表。我试图实现的格式如下: 选择一个{level 1} 选择一个绑定到级别1的{level 2} 选择一个绑定到级别2的{level 3} 选择一个绑定到级别3的{level 4} 我一直在研究的代码如下所示。这源自: 这里有一个解决方案,您也可以通过添加邮政编码来进一步改进 import tkinter as tk from tkinter import ttk cars = {"Bugatti":[&quo

我正在尝试制作一个GUI,它具有依赖于上一个下拉列表的绑定下拉列表。我试图实现的格式如下:

  • 选择一个{level 1}
  • 选择一个绑定到级别1的{level 2}
  • 选择一个绑定到级别2的{level 3}
  • 选择一个绑定到级别3的{level 4}
  • 我一直在研究的代码如下所示。这源自:


    这里有一个解决方案,您也可以通过添加邮政编码来进一步改进

    import tkinter as tk
    from tkinter import ttk
    
    cars = {"Bugatti":["Veyron","Golf"] ,"BMW":["330M"]}
        
    
    def change_dropdown(*args):
    
        print("Chosen brand " + tkvar.get())
    
        for x, y in cars.items():
            if tkvar.get() == x:
                tkvar2.set(y[0])
                popupMenu2.configure(values=y)
            
         
    root = tk.Tk()
    canvas = tk.Canvas(root, height=500, width= 500, bg="white")
    canvas.pack()
    
    tkvar = tk.StringVar(root)
    
    tkvar2 = tk.StringVar(root)
    
    tkvar3 = tk.StringVar(root)
    
    popupMenu1 = ttk.Combobox(canvas, textvariable=tkvar, values=list(cars.keys()))
    popupMenu1.pack()
    popupMenu1.bind('<<comboboxselected>>', change_dropdown)
    
    popupMenu2 = ttk.Combobox(canvas, textvariable=tkvar2, values=[])
    popupMenu2.pack()
    popupMenu1.bind('<<comboboxselected>>', change_dropdown)
    
    popupMenu3 = ttk.Combobox(canvas, textvariable=tkvar3, values=[])
    popupMenu3.pack()
    
    root.mainloop()
    

    那么你的问题到底是什么呢?
    state
    CBSA
    之间,以及
    CBSA
    Zip
    之间没有联系。那么
    CBSA
    如何依赖于
    state
    ,以及
    Zip
    如何依赖于
    CBSA
    ?基于更接近工作模型的更新问题,更符合我的总体设计。需要看到“Zip”条目根据第二个下拉列表的选择填充到第三个下拉列表中。这就是我需要帮助的地方。谢谢@JacksonPro!这很有帮助。我不得不做一些轻微的修改,为第三个下拉选项提供多个选项;例如:_-zip=[[[“TEST1”]、[“TEST11”]、[[“TEST2”]、[“Hello”]、[“World”]、[“TEST3”]。但这有助于我了解我正在寻找的总体结构;请参阅原始帖子中的更新部分。我需要说明网格的位置,这是我通过调整答案完成的。@andrewhick您需要给行和列的权重1:
    tk.grid.rowconfigure(root,(0,1,2),weight=1)tk.grid.columnconfigure(root,(0,1,2),weight=1)
    ,这有助于根据窗口大小将它们隔开并调整大小?那太好了!谢谢@安德烈:这对我来说很好。我没有使用jupyter笔记本,所以我不确定问题出在哪里。
    import tkinter as tk
    from tkinter import ttk
    
    
    
    cars = {"Bugatti":["Veyron","Golf"] ,"BMW":["330M"]}
    
    _zip = [[["TEST1"],["TEST11"]],[["TEST2"],["Hello"],["World"]],["TEST3"]]
    
    lst = [x for y in list(cars.values()) for x in y]
    
    
    def change_dropdown(*args):
    
        print("Chosen brand " + tkvar.get())
    
        if args[0] == 'PY_VAR0':
            for x, y in cars.items():
                if tkvar.get() == x:
                    tkvar2.set(y[0])
                    popupMenu2.configure(values=y)
            
        if args[0] == 'PY_VAR1':
            for x, y in zip(lst, _zip):
                if tkvar2.get() == x:            
                    tkvar3.set(y[0])
                    popupMenu3.configure(values=y)
            
        return
        
    root = tk.Tk()
    # canvas = tk.Canvas(root, height=500, width= 500, bg="white")
    root.geometry('500x100')
    font = ("Courier", 16, "bold")
    # canvas.pack()
    
    tkvar = tk.StringVar(root)
    tkvar.trace('w', change_dropdown)
    
    tkvar2 = tk.StringVar(root)
    tkvar2.trace('w', change_dropdown)
    
    tkvar3 = tk.StringVar(root)
    
    labelTop = tk.Label(root, text = "Select a State")
    labelTop.grid(column=0, row=0)
    popupMenu1 = ttk.Combobox(root, textvariable=tkvar, values=list(cars.keys()))
    popupMenu1.grid(row=0, column=1)
    # popupMenu1.pack()
    
    popupMenu2 = ttk.Combobox(root, textvariable=tkvar2, values=[])
    popupMenu2.grid(row=1, column=1)
    # popupMenu2.pack()
    
    popupMenu3 = ttk.Combobox(root, textvariable=tkvar3, values=[])
    popupMenu3.grid(row=2, column=1)
    # popupMenu3.pack()
    
    root.mainloop()
    
    import tkinter as tk
    from tkinter import ttk
    
    cars = {"Bugatti":["Veyron","Golf"] ,"BMW":["330M"]}
        
    
    def change_dropdown(*args):
    
        print("Chosen brand " + tkvar.get())
    
        for x, y in cars.items():
            if tkvar.get() == x:
                tkvar2.set(y[0])
                popupMenu2.configure(values=y)
            
         
    root = tk.Tk()
    canvas = tk.Canvas(root, height=500, width= 500, bg="white")
    canvas.pack()
    
    tkvar = tk.StringVar(root)
    
    tkvar2 = tk.StringVar(root)
    
    tkvar3 = tk.StringVar(root)
    
    popupMenu1 = ttk.Combobox(canvas, textvariable=tkvar, values=list(cars.keys()))
    popupMenu1.pack()
    popupMenu1.bind('<<comboboxselected>>', change_dropdown)
    
    popupMenu2 = ttk.Combobox(canvas, textvariable=tkvar2, values=[])
    popupMenu2.pack()
    popupMenu1.bind('<<comboboxselected>>', change_dropdown)
    
    popupMenu3 = ttk.Combobox(canvas, textvariable=tkvar3, values=[])
    popupMenu3.pack()
    
    root.mainloop()
    
    import tkinter as tk
    from tkinter import ttk
    
    cars = {"Bugatti":["Veyron","Golf"] ,"BMW":["330M"]}
    
    _zip = [["TEST1"],["TEST2"],["TEST3"]]
    
    lst = [x for y in list(cars.values()) for x in y]
    
    
    def change_dropdown(*args):
    
        print("Chosen brand " + tkvar.get())
    
        if args[0] == 'PY_VAR0':
            for x, y in cars.items():
                if tkvar.get() == x:
                    tkvar2.set(y[0])
                    popupMenu2.configure(values=y)
            
        if args[0] == 'PY_VAR1':
            for x, y in zip(lst, _zip):
                if tkvar2.get() == x:            
                    tkvar3.set(y[0])
                    popupMenu3.configure(values=y)
            
        return
        
    root = tk.Tk()
    canvas = tk.Canvas(root, height=500, width= 500, bg="white")
    canvas.pack()
    
    tkvar = tk.StringVar(root)
    tkvar.trace('w', change_dropdown)
    
    tkvar2 = tk.StringVar(root)
    tkvar2.trace('w', change_dropdown)
    
    tkvar3 = tk.StringVar(root)
    
    popupMenu1 = ttk.Combobox(canvas, textvariable=tkvar, values=list(cars.keys()))
    popupMenu1.pack()
    
    popupMenu2 = ttk.Combobox(canvas, textvariable=tkvar2, values=[])
    popupMenu2.pack()
    
    popupMenu3 = ttk.Combobox(canvas, textvariable=tkvar3, values=[])
    popupMenu3.pack()
    
    root.mainloop()