You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:52:44