下拉菜单未按预期保持选中状态

0 投票
1 回答
19 浏览
提问于 2025-04-12 17:42

在我的代码中,我有三个相互依赖的下拉菜单,但中间的菜单没有保持我选择的值。其他的都正常工作,也就是说,如果我在主菜单中选择了选项1,那么子菜单应该显示aaaa和bbbb这两个选项,然后子子菜单会根据我选择的1111和2222来保持我的选择。

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['menu'].add_command(label=item, command=lambda value=item: 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()

1 个回答

0

这是我会怎么做的。

中间的菜单没有保持选中的值,因为 sub_menu_var 没有更新为新加载选项中的值。要解决这个问题:

  • 在 update_sub_menu 函数中,用新选项的第一个项目更新 sub_menu_var。
  • 只需将新项目添加到子菜单中,并将 sub_menu_var 设置为第一个项目,以确保它有一个默认选择。
  • 用子菜单的第一个项目调用 update_sub_sub_menu,以更新子子菜单。

下面是实现这些步骤的代码。

def update_sub_menu(*args):
    sub_menu_var.set("") 
    sub_menu['menu'].delete(0, 'end') 
    sub_sub_menu_var.set("") 
    sub_sub_menu['menu'].delete(0, 'end')
    
    selected_option = main_menu_var.get()
    if selected_option in submenus:
        first_item = None
        for item in submenus[selected_option]:
            if first_item is None:
                first_item = item
            sub_menu['menu'].add_command(label=item, command=lambda value=item: update_sub_sub_menu(selected_option, value))
        
        if first_item:
            sub_menu_var.set(first_item)
            update_sub_sub_menu(selected_option, first_item)

如果这就是你想要的,请告诉我。

撰写回答