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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值