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

如何获取Tkinter中通过.add_cascade添加的嵌套子菜单对象?

能否获取通过.add_cascade添加的Tkinter嵌套子菜单对象?

当存在通过.add_cascade()方法添加了子菜单的嵌套Tkinter Menu对象时,是否可以获取该子菜单对象?我编写了如下测试代码(menu_lab.py):

import tkinter as tk

def main(root):
    top = tk.Menu(root)
    root.config(menu=top)
    top.add_command(label='Get sub', command=lambda t=top: get_sub(t))
    sub = tk.Menu(top)
    sub.add_command(label='Glider', command=lambda: print('Glider'))
    top.add_cascade(label='Insert', menu=sub)
    get_sub(top)

def get_sub(top):
    for i in range(top.index(tk.END) + 1):
        try:
            if top.entrycget(i, 'label') == 'Insert':
                sub = top.entrycget(i, 'menu')
                print(f'{sub = }')
        except tk.TclError:  # unknown option "-label"
            continue

if __name__ == '__main__':
    root = tk.Tk()
    main(root)
    root.mainloop()

运行后输出结果为:

$ python menu_lab.py
sub = '.!menu.!menu'

运行环境:Python 3.9.2,Debian 11


可以获取到对应的子菜单对象。你当前代码拿到的.!menu.!menu是Tkinter内部用于标识控件的路径名,通过nametowidget()方法就能将这个路径转换为实际的Python Menu实例。

修改后的get_sub函数示例:

def get_sub(top):
    for i in range(top.index(tk.END) + 1):
        try:
            if top.entrycget(i, 'label') == 'Insert':
                sub_path = top.entrycget(i, 'menu')
                # 将路径转换为Menu对象
                sub_menu = top.master.nametowidget(sub_path)
                print(f'{sub_menu = }')
                # 验证:查看子菜单的条目数量
                print(f'子菜单条目数:{sub_menu.index(tk.END) + 1}')
        except tk.TclError:  # unknown option "-label"
            continue

运行修改后的代码,会输出类似sub_menu = <tkinter.Menu object .!menu.!menu>的结果,此时sub_menu就是你通过.add_cascade添加的子菜单对象,可以直接调用它的方法(比如添加新条目、修改配置等)。


内容的提问来源于stack exchange,提问作者Vladimir Zolotykh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:35:27