tkinter中控件menu的两种组织方法
tkinter中,菜单控件组织方法有两种,使用中常出现混淆,为明晰各个正确用法,特整理撰写此博文。菜单控件的组织实际上是通过一个“母菜单”和“子菜单”构成,“母菜单”一方面与master连接(即与依附控件的关联),一方面与”子菜单“连接,而子菜单则负责展示及响应。
”母菜单“可以采用Menu类或者Menubutton类,由此产生出两种组织方法:
(1)Menu类:
能与Toplevel和TK类关联,但不可以与Frame类关联:menu=Menu(Toplevel());Toplevel().config(menu=menu)
与”子菜单“的关联为:pulldown=Menu(menu);menu.add_cascade(menu=pulldown,label='text')
而不能与Tk类,和Frame类关联;
如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | >>> from tkinter import * >>> root = Tk() >>> menu1 = Menu(root) >>> root.config(menu = menu1,label = 'test1' ) Traceback (most recent call last): File "<pyshell#3>" , line 1 , in <module> root.config(menu = menu1,label = 'test1' ) File "C:\Users\旺仔QQ糖\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py" , line 1485 , in configure return self ._configure( 'configure' , cnf, kw) File "C:\Users\旺仔QQ糖\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py" , line 1476 , in _configure self .tk.call(_flatten(( self ._w, cmd)) + self ._options(cnf)) _tkinter.TclError: unknown option "-label" >>> root.config(menu = menu1) >>> pulldown = Menu(menu1) >>> pulldown.add_command(label = 'test2' ) >>> menu1.add_cascade(menu = pulldown,label = 'testit' ) >>> frm = Frame(root) >>> frm.pack(side = BOTTOM) >>> menu2 = Menu(frm) >>> frm.config(menu = menu2,label = 'test3' ) Traceback (most recent call last): File "<pyshell#11>" , line 1 , in <module> frm.config(menu = menu2,label = 'test3' ) File "C:\Users\旺仔QQ糖\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py" , line 1485 , in configure return self ._configure( 'configure' , cnf, kw) File "C:\Users\旺仔QQ糖\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py" , line 1476 , in _configure self .tk.call(_flatten(( self ._w, cmd)) + self ._options(cnf)) _tkinter.TclError: unknown option "-menu" >>> tplv = Toplevel(root) >>> menu3 = Menu(tplv) >>> tplv.config(menu = menu3,label = 'test3' ) Traceback (most recent call last): File "<pyshell#14>" , line 1 , in <module> tplv.config(menu = menu3,label = 'test3' ) File "C:\Users\旺仔QQ糖\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py" , line 1485 , in configure return self ._configure( 'configure' , cnf, kw) File "C:\Users\旺仔QQ糖\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py" , line 1476 , in _configure self .tk.call(_flatten(( self ._w, cmd)) + self ._options(cnf)) _tkinter.TclError: unknown option "-label" >>> tplv.config(menu = menu3) >>> menuu = Menu(menu3) >>> menuu.add_command(label = 'try it...' ) >>> menu3.add_cascade(menu = menuu,label = 'getit' ) |
(2)Menubutton类:
可以与Tk类,Frame类,Toplevel类关联:menubutton=Menubutton(Root,text='text');menubutton.pack();
与”子菜单“的关联为:pulldown=Menu(menubutton);menubutton.config(menu=pulldown)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | >>> menbt = Menubutton(root,text = 'help1' ) >>> menbt.pack() >>> menbt.add_command(label = '1' ) Traceback (most recent call last): File "<pyshell#23>" , line 1 , in <module> menbt.add_command(label = '1' ) AttributeError: 'Menubutton' object has no attribute 'add_command' >>> frm = Frame(root) >>> frm.pack(side = BOTTOM) >>> Menubutton(frm,text = 'test1' ) <tkinter.Menubutton object .!frame.!menubutton> >>> Menubutton(frm,text = 'test1' ).pack() >>> tplv1 = Toplevel(root) >>> Menubutton(tplv1,text = 'test2' ) <tkinter.Menubutton object .!toplevel.!menubutton> >>> Menubutton(tplv1,text = 'test2' ).pack() |
而当”子菜单“扩展时,可以继续使用add_cascade方法,从这个角度看,”母菜单“使用Menu类的组织方法可以看作是Menu控件的扩展方法。
下面是两个简单的Demo:
1 2 3 4 5 6 7 8 9 | >>> from tkinter import * >>> root = Toplevel() >>> menu = Menu(root) >>> root.config(menu = menu) >>> pulldow = Menu(menu) >>> pulldow.add_command(label = 'test1' ) >>> pulldow.add_command(label = 'test2' ) >>> pulldow.add_separator() >>> menu.add_cascade(menu = pulldow,label = 'menu' ) |
1 2 3 4 5 6 7 8 | >>> from tkinter import * >>> root = Tk() >>> menubtn = Menubutton(root,text = 'menubtn' ) >>> menubtn.pack() >>> pulldown = Menu(menubtn) >>> pulldown.add_command(label = 'test1' ,command = None ) >>> pulldown.add_command(label = 'test2' ,command = None ) >>> menubtn.config(menu = pulldown) |
总结:两种方式中,第一个Menu的安置需要依附控件(root,toplevel)的config方法;”母菜单“为Menu类时,实质是Menu的扩展;”母菜单“为Menubutton时,它本身具有Button的属性,所以参数需要master,text,command,联结”子菜单“时(肯定是第一个Menu类),所以需要config方法,需要注意的是Menu不可以依附在Frame上,而Menubutton可以。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix