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. >>> from tkinter import *
  2. >>> root=Tk()
  3. >>> menu1=Menu(root)
  4. >>> root.config(menu=menu1,label='test1')
  5. Traceback (most recent call last):
  6. File "<pyshell#3>", line 1, in <module>
  7. root.config(menu=menu1,label='test1')
  8. File "C:\Users\旺仔QQ糖\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1485, in configure
  9. return self._configure('configure', cnf, kw)
  10. File "C:\Users\旺仔QQ糖\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1476, in _configure
  11. self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
  12. _tkinter.TclError: unknown option "-label"
  13. >>> root.config(menu=menu1)
  14. >>> pulldown=Menu(menu1)
  15. >>> pulldown.add_command(label='test2')
  16. >>> menu1.add_cascade(menu=pulldown,label='testit')
  17. >>> frm=Frame(root)
  18. >>> frm.pack(side=BOTTOM)
  19. >>> menu2=Menu(frm)
  20. >>> frm.config(menu=menu2,label='test3')
  21. Traceback (most recent call last):
  22. File "<pyshell#11>", line 1, in <module>
  23. frm.config(menu=menu2,label='test3')
  24. File "C:\Users\旺仔QQ糖\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1485, in configure
  25. return self._configure('configure', cnf, kw)
  26. File "C:\Users\旺仔QQ糖\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1476, in _configure
  27. self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
  28. _tkinter.TclError: unknown option "-menu"
  29. >>> tplv=Toplevel(root)
  30. >>> menu3=Menu(tplv)
  31. >>> tplv.config(menu=menu3,label='test3')
  32. Traceback (most recent call last):
  33. File "<pyshell#14>", line 1, in <module>
  34. tplv.config(menu=menu3,label='test3')
  35. File "C:\Users\旺仔QQ糖\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1485, in configure
  36. return self._configure('configure', cnf, kw)
  37. File "C:\Users\旺仔QQ糖\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1476, in _configure
  38. self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
  39. _tkinter.TclError: unknown option "-label"
  40. >>> tplv.config(menu=menu3)
  41. >>> menuu=Menu(menu3)
  42. >>> menuu.add_command(label='try it...')
  43. >>> 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. >>> menbt=Menubutton(root,text='help1')
  2. >>> menbt.pack()
  3. >>> menbt.add_command(label='1')
  4. Traceback (most recent call last):
  5. File "<pyshell#23>", line 1, in <module>
  6. menbt.add_command(label='1')
  7. AttributeError: 'Menubutton' object has no attribute 'add_command'
  8. >>> frm=Frame(root)
  9. >>> frm.pack(side=BOTTOM)
  10. >>> Menubutton(frm,text='test1')
  11. <tkinter.Menubutton object .!frame.!menubutton>
  12. >>> Menubutton(frm,text='test1').pack()
  13. >>> tplv1=Toplevel(root)
  14. >>> Menubutton(tplv1,text='test2')
  15. <tkinter.Menubutton object .!toplevel.!menubutton>
  16. >>> Menubutton(tplv1,text='test2').pack()

  

而当”子菜单“扩展时,可以继续使用add_cascade方法,从这个角度看,”母菜单“使用Menu类的组织方法可以看作是Menu控件的扩展方法。

下面是两个简单的Demo:

  1. >>> from tkinter import *
  2. >>> root=Toplevel()
  3. >>> menu=Menu(root)
  4. >>> root.config(menu=menu)
  5. >>> pulldow=Menu(menu)
  6. >>> pulldow.add_command(label='test1')
  7. >>> pulldow.add_command(label='test2')
  8. >>> pulldow.add_separator()
  9. >>> menu.add_cascade(menu=pulldow,label='menu')
  1. >>> from tkinter import *
  2. >>> root=Tk()
  3. >>> menubtn=Menubutton(root,text='menubtn')
  4. >>> menubtn.pack()
  5. >>> pulldown=Menu(menubtn)
  6. >>> pulldown.add_command(label='test1',command=None)
  7. >>> pulldown.add_command(label='test2',command=None)
  8. >>> menubtn.config(menu=pulldown)

  

  

总结:两种方式中,第一个Menu的安置需要依附控件(root,toplevel)的config方法;”母菜单“为Menu类时,实质是Menu的扩展;”母菜单“为Menubutton时,它本身具有Button的属性,所以参数需要master,text,command,联结”子菜单“时(肯定是第一个Menu类),所以需要config方法,需要注意的是Menu不可以依附在Frame上,而Menubutton可以。

tkinter中控件menu的两种组织方法的更多相关文章

  1. [转]MFC子线程中更新控件内容的两种办法

    一.概述 每个系统中都有线程(至少都有一个主线程),而线程最重要的作用就是并行处理,提高软件的并发率.针对界面来说,还能提高界面的响应能力.一般的,为了应用的稳定性,在数据处理等耗时操作会单独在一个线 ...

  2. duilib中控件拖拽功能的实现方法(附源码)

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41144283 duilib库中原本没有显示的对控件增加拖拽的功能,而实际 ...

  3. angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

    今天我们要讲的是ng2的路由系统. 例子

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

    转:https://blog.csdn.net/holybin/article/details/38637381 一.对于IDE接口的硬盘的两种表示方法: 1.IDE接口硬盘,对于整块硬盘的两种表示方 ...

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

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

  6. GET和POST是HTTP请求的两种基本方法,区别是什么!?

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  7. git两种合并方法 比较merge和rebase

    18:01 2015/11/18git两种合并方法 比较merge和rebase其实很简单,就是合并后每个commit提交的id记录的顺序而已注意:重要的是如果公司用了grrit,grrit不允许用m ...

  8. 两种Ajax方法

    两种Ajax方法 Ajax是一种用于快速创建动态网页的技术,他通过在后台与服务器进行少量的数据交换,可以实现网页的异步更新,不需要像传统网页那样重新加载页面也可以做到对网页的某部分作出更新,现在这项技 ...

  9. mysql in 的两种使用方法

    简述MySQL 的in 的两种使用方法: 他们各自是在 in keyword后跟一张表(记录集).以及在in后面加上字符串集. 先讲后面跟着一张表的. 首先阐述三张表的结构: s(sno,sname. ...

随机推荐

  1. SpringMVC架构&组件&执行流程

    SpringMVC架构: 组件: DIspatcherServlet:前端控制器.相当于mvc模式的c,是整个流程控制的中心,负责调用其他组件处理用户的请求,降低了组件之间的耦合性. HandlerM ...

  2. 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase简介

    实验目的 了解hbase的概念 通过安装hbase了解hbase的原理 了解hbase与hadoop的关系 复习hadoop和zookeeper的运行 实验原理 hbase是bigtable的开源山寨 ...

  3. CSS 常用操作

    1.对齐 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...

  4. day15-Python运维开发基础(json序列化模块、random / time / zipfile / OS模块函数)

    1. json序列化模块 # ### json """ 所有编程语言都能够识别的数据格式叫做json,是字符串 json: 将数据类型序列化成字符串 pickle:将数据 ...

  5. AJAX的表单请求POST请求方式

    表单数据的提交 action : 数据提交的地址,默认是当前页面 method : 数据提交的方式,默认是get方式 post: 把数据名称和数据值用=连接,如果有多个的话,那么他会把多个数据组合用& ...

  6. Content Provider基础

    1.Content Provider为存储和获取数据提供了统一的接口. 2.Content Provider可以在不同的应用程序之间共享数据. 3.Android为常见的一些数据提供了ContentP ...

  7. 【LOJ2540】「PKUWC2018」随机算法

    题意 题面 给一个 \(n\) 个点 \(m\) 条边的无向图.考虑如下求独立集的随机算法:随机一个排列并按顺序加点.如果当前点能加入独立集就加入,否则不加入.求该算法能求出最大独立集的概率. \(n ...

  8. leetcode347 Top K Frequent Elements

    """ Given a non-empty array of integers, return the k most frequent elements. Example ...

  9. vue ref父子组件传值

    一. ref使用在父组件上 父组件html: <information ref='information'></information> import information ...

  10. Eclipse启动选择启动空间

    window -->preferences-->General-->Startup and Shutdown -->Workspaces-->勾选Prompt for w ...