Tkinter:创建动态下拉列表



我正试图为我正在编写的应用程序设置动态下拉菜单。当在Primary上选择一个选项时,我很难更新次要下拉列表。我不确定在这种情况下是否应该使用for循环,还是需要考虑其他选项。

import tkinter as tk
primary = [
'option 1',
'option 2',
'option 3',
'option 4'
]
options1 = [
'option 1.1',
'option 1.2',
'option 1.3',
'option 1.4'
]
options2 = [
'option 2.1',
'option 2.2',
'option 2.3',
'option 2.4'
]
secondary = options1

#Window builder
window = tk.Tk()
window.geometry('400x200')
#Primary Drop Down Options
primDD = tk.StringVar()
primDD.set(primary[0])
primOpt = tk.OptionMenu(window, primDD, *primary)
#secondary Selector
if primDD.get() == 'options 1':
secondary = options1
elif primDD.get() == 'options 2':
secondary = options2
#Secondary Drop Down Options
secDD = tk.StringVar()
secDD.set(secondary[0])
secOpt = tk.OptionMenu(window, secDD, *secondary)
#Window Layout
primOpt.config(width=20)
secOpt.config(width=30)
primOpt.grid(row=0, column=0, padx=1.25, pady=1.25)
secOpt.grid(row=0, column=1, padx=1.25, pady=1.25)
window.mainloop()

这是代码:

import tkinter as tk
primary = [
'option 1',
'option 2',
'option 3',
'option 4'
]
options1 = [
'option 1.1',
'option 1.2',
'option 1.3',
'option 1.4'
]
options2 = [
'option 2.1',
'option 2.2',
'option 2.3',
'option 2.4'
]
secondary = options1

#Window builder
window = tk.Tk()
window.geometry('400x200')
#Primary Drop Down Options
primDD = tk.StringVar()
primDD.set(primary[0])
primOpt = tk.OptionMenu(window, primDD, *primary)
#secondary Selector
if primDD.get() == 'options 1':
secondary = options1
elif primDD.get() == 'options 2':
secondary = options2
#Secondary Drop Down Options
secDD = tk.StringVar()
secDD.set(secondary[0])
secOpt = tk.OptionMenu(window, secDD, *secondary)
#Window Layout
primOpt.config(width=20)
secOpt.config(width=30)
primOpt.grid(row=0, column=0, padx=1.25, pady=1.25)
secOpt.grid(row=0, column=1, padx=1.25, pady=1.25)
def change_optionmenu2(*args):
print(args)
if primDD.get() == "option 1":
new_options = options1
elif primDD.get() == "option 2":
new_options = options2
else:
new_options = ["Not coded in"]
secDD.set('')
secOpt['menu'].delete(0, 'end')
for choice in new_options:
secOpt['menu'].add_command(label=choice, command=tk._setit(secDD, choice))
secDD.set(new_options[0])
primDD.trace("w", change_optionmenu2)
window.mainloop()

change_optionmenu2在主选择改变时被调用。要了解更多关于如何更改的信息,请查看此

最新更新