• 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糖AppDataLocalProgramsPythonPython37-32lib	kinter\__init__.py", line 1485, in configure
        return self._configure('configure', cnf, kw)
      File "C:Users旺仔QQ糖AppDataLocalProgramsPythonPython37-32lib	kinter\__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糖AppDataLocalProgramsPythonPython37-32lib	kinter\__init__.py", line 1485, in configure
        return self._configure('configure', cnf, kw)
      File "C:Users旺仔QQ糖AppDataLocalProgramsPythonPython37-32lib	kinter\__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糖AppDataLocalProgramsPythonPython37-32lib	kinter\__init__.py", line 1485, in configure
        return self._configure('configure', cnf, kw)
      File "C:Users旺仔QQ糖AppDataLocalProgramsPythonPython37-32lib	kinter\__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可以。

    ##### 愿你一寸一寸地攻城略地,一点一点地焕然一新 #####
  • 相关阅读:
    if elseif else
    java编程思想第四版中net.mindview.util包
    eclipse git插件配置
    php面试常用算法
    数据库字段类型中char和Varchar区别
    MySQL的数据库引擎的类型及区别
    windows系统中eclipse C c++开发环境的搭建
    launch failed.Binary not found in Linux/Ubuntu解决方案
    技术团队的情绪与效率
    如何有效使用Project(2)——进度计划的执行与监控
  • 原文地址:https://www.cnblogs.com/johnyang/p/11020610.html
Copyright © 2020-2023  润新知