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类关联;

如下代码:

>>> 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 configurereturn self._configure('configure', cnf, kw)File "C:\Users\旺仔QQ糖\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1476, in _configureself.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 configurereturn self._configure('configure', cnf, kw)File "C:\Users\旺仔QQ糖\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1476, in _configureself.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 configurereturn self._configure('configure', cnf, kw)File "C:\Users\旺仔QQ糖\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1476, in _configureself.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)

>>> 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:

>>> 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')

>>> 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可以。

转载于:https://www.cnblogs.com/johnyang/p/11020610.html

tkinter中控件menu的两种组织方法相关推荐

  1. ModalPopupExtender控件主要有两种使用方式:客户端使用方式和服务器端使用方式

    ModalPopupExtender控件主要有两种使用方式:客户端使用方式和服务器端使用方式.这两种使用方式在ModalPopup的官方例子中都有介绍. 1.客户端使用方式 客户端使用方式又可以分为两 ...

  2. sdhc卡文件丢失常见原因和两种恢复方法

    sdhc卡作为sd卡的继任者,主要有容量/速度等级高.支持文件格式和兼容的机器多等特征,通常被用于存储大量文件的设备中,比如松下照相机.但是sdhc卡跟其他存储设备相似,也会因各种原因导致重要数据丢失 ...

  3. 【FFMPEG】H264码流的两种组织方式:AnnexB和AVCC

    H264码流分两种组织方式,一种是AnnexB格式,一种是AVCC格式 AnnexB格式 标准名称是MPEG-2 Tansport Stream Format,适合网络传输 和标准的H264文件格式一 ...

  4. IOS学习之UISwitch控件两种使用方法和监听

    IOS学习之UISwitch控件两种使用方法和监听 分类: IOS开发入门2012-06-15 11:48 1363人阅读 评论(0) 收藏 举报 一.第一种创建UISwitch控件的方法,在代码中动 ...

  5. C# 删除chart控件网格:两种方法

    C#winform程序 - 删除chart控件网格:两种方法 看网上说把网格线的颜色换成背景色,感觉不太正宗.... 于是探索了一下,喜欢的同鞋点个赞收藏一下呗! 1.编辑控件属性 (点击图片放大观看 ...

  6. C#WPF实现TextBox控件水印效果的两种实现方法

    C#WPF实现TextBox控件水印效果的两种实现方法 在WPF实际项目中往往需要在TextBox中加入水印,来告诉使用者输入TextBox中的内容,如下图片所示: 下面介绍两种方式,来添加上图中的水 ...

  7. Ext.Ajax.request和formPanel.getForm().submit()两种提交方法的异同:

    Ext.Ajax.request和formPanel.getForm().submit()两种提交方法的异同: 1. 相同点: a) 都是使用异步提交的方式: b) 默认都是使用POST方式来提交数据 ...

  8. HTML中label的两种使用方法

    如果您在 label 元素内点击文本,就会触发此控件.就是说,当用户选择该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上. 有两种使用方法: 方法1: 1 <label for=&quo ...

  9. 在.NET中执行Async/Await的两种错误方法

    微信公众号:架构师高级俱乐部 关注可了解更多的编程,架构知识.问题或建议,请公众号留言; 如果你觉得此文对你有帮助,欢迎转发 在.NET中执行异步/等待的两种错误方法 在应用开发中,我们为了提高应用程 ...

  10. 在Linux系统中存储设备的两种表示方法

    作者:北南南北 来自:LinuxSir.Org 摘要: 硬盘和硬盘分区在Linux都表示为设备,按我们通俗的说法来说,就是怎么来表示或描述硬盘和或硬盘分区,但这种描述应该是科学和具体的:比如IDE硬盘 ...

最新文章

  1. float最大值_float.h库
  2. 三星会使用华为的鸿蒙系统,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  3. c语言osversioninfoex,xi52qian
  4. JS实现在输入框内输入@时,邮箱账号自动补全
  5. Excel中的fixed函数
  6. go-micro 框架初探
  7. ORACLE ERP 的前世今生(1)
  8. mysql的db.opt文件_MySQL数据库的db.opt文件
  9. 解析offsetHeight,clientHeight,scrollHeight之间的区别
  10. 模糊控制完全理解系列(二)—— 模糊集合论基础之模糊集基础概念
  11. 卷积神经网络以LeNet网络为例的手写体识别
  12. Aras Innovator: AML包
  13. 趁年轻,多尝试一些富有挑战的工作吧
  14. 易语言让我逆天改命--李长茂(紫川秀)————【Badboy】
  15. Python中的and和or运算
  16. 华为诺亚方舟实验室简述
  17. 高数 | 复合函数、幂指函数中等价无穷小替换的问题
  18. 博客园 页首html代码,可爱的博客园样式美化、自定义博客园主题样式
  19. word文档转换为PDF
  20. 解数独 — Python

热门文章

  1. macbookair有没有touchbar_高配MacBook Air和低配MacBook Pro选哪个?
  2. 计算机论文 a会 c会,ccf b类论文 sci几区_焦文静_电影学者王田
  3. 投入产出实例matlab,基于MATLAB的投入产出分析
  4. Python 爬虫之初体验(实习僧)
  5. PTA:设计一个风扇Fan类 (20 分)
  6. cubieboard刷机
  7. 403高校毕业设计选题
  8. Power System中基于VIOS的虚拟以太网实现
  9. ubuntu16.04设置自启动wifi热点
  10. kvm迁移镜像启动报错