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类关联;
如下代码:
>>> 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)
>>> 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可以。
tkinter中控件menu的两种组织方法的更多相关文章
- [转]MFC子线程中更新控件内容的两种办法
一.概述 每个系统中都有线程(至少都有一个主线程),而线程最重要的作用就是并行处理,提高软件的并发率.针对界面来说,还能提高界面的响应能力.一般的,为了应用的稳定性,在数据处理等耗时操作会单独在一个线 ...
- duilib中控件拖拽功能的实现方法(附源码)
转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41144283 duilib库中原本没有显示的对控件增加拖拽的功能,而实际 ...
- angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用
今天我们要讲的是ng2的路由系统. 例子
- Linux系统中存储设备的两种表示方法
转:https://blog.csdn.net/holybin/article/details/38637381 一.对于IDE接口的硬盘的两种表示方法: 1.IDE接口硬盘,对于整块硬盘的两种表示方 ...
- HTML中label的两种使用方法
如果您在 label 元素内点击文本,就会触发此控件.就是说,当用户选择该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上. 有两种使用方法: 方法1: <label for=" ...
- GET和POST是HTTP请求的两种基本方法,区别是什么!?
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
- git两种合并方法 比较merge和rebase
18:01 2015/11/18git两种合并方法 比较merge和rebase其实很简单,就是合并后每个commit提交的id记录的顺序而已注意:重要的是如果公司用了grrit,grrit不允许用m ...
- 两种Ajax方法
两种Ajax方法 Ajax是一种用于快速创建动态网页的技术,他通过在后台与服务器进行少量的数据交换,可以实现网页的异步更新,不需要像传统网页那样重新加载页面也可以做到对网页的某部分作出更新,现在这项技 ...
- mysql in 的两种使用方法
简述MySQL 的in 的两种使用方法: 他们各自是在 in keyword后跟一张表(记录集).以及在in后面加上字符串集. 先讲后面跟着一张表的. 首先阐述三张表的结构: s(sno,sname. ...
随机推荐
- python组合数据类型和数据结构
//2019.12-071.pyhton里面组合数据类型主要有三种:集合(set).序列(字符串str.列表list and 元组tuple)和映射(字典dic)2.集合类型一般使用大括号{}来进行表 ...
- 银行输入密码五次次数限制python程序实现
python银行输入密码五次次数限制程序实现,主要在于对于异常情况的处理语句的编写,需要使用while循环语句和try和except异常处理语句的复合编写语句n=0while n<5: try: ...
- SpringMVC架构&组件&执行流程
SpringMVC架构: 组件: DIspatcherServlet:前端控制器.相当于mvc模式的c,是整个流程控制的中心,负责调用其他组件处理用户的请求,降低了组件之间的耦合性. HandlerM ...
- tomcat web服务的搭建
在安装tomcat之前必须安装jdk 安装配置jdk 1.查看虚拟机中是否已安装java包 # rpm -qa | grep java 如果查找已安装java包,先卸载全部的openjdk #rpm ...
- STM32CubeMX+FreeRTOS 定时器os_timer的使用
转载:https://blog.csdn.net/jacklondonjia/article/details/78497120在STM32CubeMX的FreeRTOS配置中,使能FreeRTOS的S ...
- Linux CentOS7 VMware usermod命令、用户密码管理、mkpasswd命令
一. usermod命令 usermod可用来修改用户帐号的各项设定 -c, --comment 注释 GECOS 字段的新值 -d, --home HOME_DIR 用户的新主目录 -e, --ex ...
- java#keytool#生成私钥证书库、公钥证书库
原文,向作者致敬
- Windows篇:链接linux->"Xmanager"
Windows篇:链接linux->"Xmanager" Xmanager是什么? Xmanager是一款小巧.便捷的浏览远端X窗口系统的工具.在工作中经常使用Xmanage ...
- Java - lastIndexOf() 方法
此方法含头不含尾,如获取方法名 add 需要 +1
- Time Series_1_BRKA Case
Berkshire Hathaway (The most expensive stock ever in the world) 1.1 Download data require(quantmod) ...