Tkinter三级联动Dropdown Menu中间菜单选中状态无法保持问题
解决Tkinter三级联动下拉菜单子菜单无法保持选中值的问题
你的三级联动下拉菜单主菜单切换、子子菜单加载都正常,但子菜单选中选项后无法保留选中状态,点击Run按钮也获取不到子菜单的选中值。
问题原因
子菜单的选项通过add_command动态添加时,每个选项的command只调用了update_sub_sub_menu函数,没有同步更新sub_menu_var的值,导致子菜单的StringVar始终为空,无法显示选中状态。
修复方案
修改子菜单选项的command逻辑,在触发子子菜单更新前,先把选中的子菜单值设置到sub_menu_var中,通过lambda表达式即可同时完成这两个操作。
修改后的完整代码
import tkinter as tk def run(): main_menu_item = main_menu_var.get() sub_menu_item = sub_menu_var.get() sub_sub_menu_item = sub_sub_menu_var.get() print("Main Menu Item:", main_menu_item) print("Sub Menu Item:", sub_menu_item) print("Sub Sub Menu Item:", sub_sub_menu_item) def update_sub_menu(*args): sub_menu_var.set("") # Clear sub menu selection sub_menu['menu'].delete(0, 'end') # Clear sub menu options sub_sub_menu_var.set("") # Clear sub sub menu selection sub_sub_menu['menu'].delete(0, 'end') # Clear sub sub menu options selected_option = main_menu_var.get() if selected_option in submenus: for item in submenus[selected_option]: # 先设置sub_menu_var,再调用update_sub_sub_menu sub_menu['menu'].add_command( label=item, command=lambda value=item: [sub_menu_var.set(value), update_sub_sub_menu(selected_option, value)] ) def update_sub_sub_menu(main_menu_item, sub_menu_item): sub_sub_menu_var.set("") # Clear sub sub menu selection sub_sub_menu['menu'].delete(0, 'end') # Clear sub sub menu options if main_menu_item in submenus and sub_menu_item in submenus[main_menu_item]: for item in sub_submenus[sub_menu_item]: sub_sub_menu['menu'].add_command(label=item, command=lambda value=item: sub_sub_menu_var.set(value)) root = tk.Tk() root.title("Menu Example") # Main Menu main_menu_var = tk.StringVar(root) main_menu_options = ["Option 1", "Option 2", "Option 3"] main_menu = tk.OptionMenu(root, main_menu_var, *main_menu_options, command=update_sub_menu) main_menu.config(width=10) # Set width to 10 main_menu.grid(row=0, column=0) # Sub Menu sub_menu_var = tk.StringVar(root) sub_menu = tk.OptionMenu(root, sub_menu_var, "") sub_menu.config(width=10) # Set width to 10 sub_menu.grid(row=0, column=1) # Sub Sub Menu sub_sub_menu_var = tk.StringVar(root) sub_sub_menu = tk.OptionMenu(root, sub_sub_menu_var, "") sub_sub_menu.config(width=10) # Set width to 10 sub_sub_menu.grid(row=0, column=2) # Submenu items submenus = { "Option 1": ["aaaa", "bbbb"], "Option 2": ["cccc", "dddd"], "Option 3": ["eeee", "ffff"] } # Sub-submenu items sub_submenus = { "aaaa": ["1111", "2222"], "bbbb": ["3333", "4444"], "cccc": ["5555", "6666"], "dddd": ["7777", "8888"], "eeee": ["9999", "1010"], "ffff": ["11aa", "12aa"] } # Run Button run_button = tk.Button(root, text="Run", command=run) run_button.grid(row=1, columnspan=3) root.mainloop()
说明
修改的核心是在子菜单的add_command中,通过lambda表达式先执行sub_menu_var.set(value)更新选中状态,再调用update_sub_sub_menu触发子子菜单联动。这样既完成了层级联动,又能让子菜单正常显示并保留选中值,点击Run按钮时也能正确获取所有菜单的选中内容。
内容的提问来源于stack exchange,提问作者RoSi
相关产品推荐
相关产品推荐

