python遍历tk菜单项的名字

发布时间 2023-07-10 19:28:30作者: 顺其自然,道法自然

直接上代码:

from tkinter import *

def print_menu_items(menu):
    num_items = menu.index('end')   # 最后一个菜单项的索引
    for index in range(num_items+1):    # 遍历所有的菜单项
        item_type = menu.type(index)    # 获取菜单项的类型
        # 菜单项的类型可以是'command'、'cascade'、'checkbutton'、'radiobutton'、'separator'或者'tearoff'。
        # tearoff==1, 表示菜单可以被撕下来变成一个单独窗口
        if item_type == 'cascade':  # 表示拥有子菜单的菜单项
            # entrycget函数的作用是获取指定选项的名称
            name = menu.entrycget(index, 'menu')    # 获得菜单项的内部名称, 形如: .!menu.!menu
            submenu = menu.nametowidget(name)   # 获得菜单项对象
            print('Cascade Menu:', menu.entrycget(index, 'label'))  # 菜单项的名称
            print_menu_items(submenu)   # 递归调用, 打印菜单名字
        elif item_type == 'command':    # 菜单项类型
            print('Menu Item:', menu.entrycget(index, 'label')) # 打印菜单名字

root = Tk()

menubar = Menu(root)

filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="New")
filemenu.add_command(label="Open")
filemenu.add_command(label="Save")
filemenu.add_command(label="Save as...")
filemenu.add_command(label="Close")

submenu = Menu(filemenu, tearoff=0)
submenu.add_command(label="Submenu 1")
submenu.add_command(label="Submenu 2")
filemenu.add_cascade(label="Submenu", menu=submenu)

menubar.add_cascade(label="File", menu=filemenu)

root.config(menu=menubar)

print_menu_items(menubar)

root.mainloop()

输出信息如下:

Cascade Menu: File
Menu Item: New
Menu Item: Open
Menu Item: Save
Menu Item: Save as...
Menu Item: Close
Cascade Menu: Submenu
Menu Item: Submenu 1
Menu Item: Submenu 2