如何获取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
相关产品推荐
相关产品推荐

