我正在尝试制作一个具有绑定下拉列表的GUI,该下拉列表依赖于以前的下拉列表。我试图实现的格式如下:
我一直在努力的代码如下所示。这是从这里派生的:
import tkinter
from tkinter import ttk
root = tkinter.Tk()
'''
widgets are added here
'''
brands = ["Bugatti","BMW"]
models = [["Veyron","Golf"],
["330M"]]
Zip = [[["TEST1"],["TEST2"]],[["TEST3"]]]
car_brand = ttk.Combobox(root, width=37, value=(brands))
car_brand.grid(row=3, column=1, columnspan=2, padx=10, pady=2, sticky='w')
def callback(eventObject):
abc = eventObject.widget.get()
car = car_brand.get()
index=brands.index(car)
car_model.config(values=models[index])
car_model = ttk.Combobox(root, width=37)
car_model.grid(row=4, column=1, columnspan=2, padx=10, pady=2, sticky='w')
car_model.bind('<Button-1>', callback)
def callback2(eventObject):
abc = eventObject.widget.get()
y = car_model.get()
index=models.index(y)
xx.config(values=Zip[index])
xx = ttk.Combobox(root, width=37)
xx.grid(row=5, column=1, columnspan=2, padx=10, pady=2, sticky='w')
xx.bind('<Button-1>', callback2)
root.mainloop()
我可能真的很亲密,但是我需要一些帮助才能使其正常工作。
更新:谢谢@JacksonPro的回答。我需要稍微调整一下以允许网格放置。见下文:
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()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句