• GUI的最终选择 Tkinter(七):菜单Menu组件、Menubutton组件、OptionMenu组件


    Menu组件

    今天说的Menu组件就是一些菜单组件,开始点点点。。。

    Tkinter提供了一个Menu组件,可以实现顶级菜单,下拉菜单和弹出菜单。由于底层是代码实现和优化的,所以不太建议通过按钮和其他组件实现菜单功能。

     1 from tkinter import *
     2 
     3 root = Tk()
     4 def check():
     5     print("被调用查看了")
     6 def slave():
     7     print("调用保存了")
     8 menubar = Menu(root)
     9 filemenu = Menu(menubar,tearoff=0)
    10 filemenu.add_command(label="保存",command=slave)
    11 filemenu.add_command(label="查看",command=check)
    12 menubar.add_cascade(label="菜单",menu=filemenu)
    13 root.config(menu=menubar)
    14 mainloop()

    执行结果:

     

    创建下拉菜单(或者其他子菜单),方法都是一样的,只是他们最后都添加到主菜单中,而不是窗口上。

     1 from tkinter import *
     2 
     3 root = Tk()
     4 def open():
     5     print("被调用open...")
     6 def slave():
     7     print("调用save...")
     8 def cut():
     9     print("被调用cut...")
    10 def slave():
    11     print("被调用slave...")
    12 def copy():
    13     print("被调用copy...")
    14 def paste():
    15     print("被调用paste...")
    16 menubar = Menu(root)
    17 #创建一个下拉菜单·文件,然后讲台添加到顶级菜单中
    18 filemenu = Menu(menubar,tearoff=0)
    19 filemenu.add_command(label="保存",command=slave)
    20 filemenu.add_command(label="打开",command=open)
    21 filemenu.add_separator()#下拉菜单的分隔线
    22 filemenu.add_command(label="退出",command=root.quit)
    23 menubar.add_cascade(label="文件",menu=filemenu)
    24 editmenu = Menu(menubar,tearoff=0)
    25 editmenu.add_command(label="剪切",command=cut)
    26 editmenu.add_command(label="拷贝",command=copy)
    27 editmenu.add_command(label="粘贴",command=paste)
    28 menubar.add_cascade(label="编辑",menu=editmenu)
    29 #显示菜单
    30 root.config(menu=menubar)
    31 mainloop()

    执行结果:

     

    这里需要注意下,在调用command后面的函数的时候不能加括号的,因为在执行的时候回从上到下执行一遍,如果添加括号会直接调用,不加括号会等待操作后调用。

    创建一个弹出菜单方法也是一致的,不过需要使用post()方法明确地将其显示出来。

     1 from tkinter import *
     2 
     3 root = Tk()
     4 menubar = Menu(root)
     5 def printItem():
     6     print("popup menu")
     7 filemenu = Menu(menubar,tearoff=0)
     8 for kk in ["python","php","jave"]:
     9     filemenu.add_command(label=kk,command=printItem)
    10     filemenu.add_separator()
    11 menubar.add_cascade(label="language",menu=filemenu)
    12 def popup(event):
    13     #显示菜单
    14     menubar.post(event.x_root,event.y_root)
    15 #在这里相应鼠标右键事件,右键调用popup,此时与菜单绑定的是root,可以设置为其他的控件,在绑定的控件上右击可以弹出菜单
    16 root.bind("<Button-3>",popup)
    17 mainloop()

    执行结果:

     

    还有一个就是tearoff方法的用法,上面的例子中我们使用最多的是tearoff=False,如果有兴趣可以试下等于True。这是tearoff的用法,也可以用0和1,区别在于,用False的时候第一菜单就是Language下有一个横杠,在右键生成的顶端没有,点击横杠的时候直接生成一个窗口,如果使用True会生成两个一级菜单一个,二级菜单一个。

    下面是Menu组件的最后一个用法,不但可以添加单选项的按钮也可以添加多选按钮,就是Checkbutton组件和Radiobutton组件类似。

     1 from tkinter import *
     2 
     3 root = Tk()
     4 def check():
     5     print("python3")
     6 menubar = Menu(root)
     7 openVar = IntVar()
     8 saveVar = IntVar()
     9 exitVar = IntVar()
    10 filemenu = Menu(menubar,tearoff=1)
    11 filemenu.add_checkbutton(label="打开",command=check,variable=openVar)
    12 filemenu.add_checkbutton(label="保存",command=check,variable=saveVar)
    13 #创建一个横线是退出上面的
    14 filemenu.add_separator()
    15 filemenu.add_checkbutton(label="退出",command=root.quit,variable=exitVar)
    16 #顶级菜单名称
    17 menubar.add_cascade(label="文件",menu=filemenu)
    18 editVar = IntVar()
    19 editVar.set(1)
    20 editmenu = Menu(menubar,tearoff=True)
    21 editmenu.add_radiobutton(label="剪切",command=check,variable=editVar,value=1)
    22 editmenu.add_radiobutton(label="拷贝",command=check,variable=editVar,value=2)
    23 editmenu.add_radiobutton(label="粘贴",command=check,variable=editVar,value=3)
    24 menubar.add_cascade(label="编辑",menu=editmenu)
    25 root.config(menu=menubar)
    26 mainloop()

    执行结果:

     

    注意:程序运行后点击顶级菜单下的横杠,会有一个菜单,可以单选可以多选。

    Menubutton组件

    Menubutton组件是一个和Menu组件相关联的按钮,Menubutton组件生成的窗口可以放在任意位置,也可以调用下拉菜单。早期版本的Tkinter会使用Menubutton组件实现顶级菜单,但是现在会直接使用Menu组件,因此,如果想自己定义菜单按钮的位置时,可以使用Menubutton组件。

    先创建一个Menubutton组件,然后在创建一个Menu组件,让他们两个进行关联。

     1 from tkinter import *
     2 
     3 root = Tk()
     4 def call():
     5     print("   python3.x")
     6 menubar = Menu(root)
     7 mb = Menubutton(root,text="python3",relief=RAISED)
     8 mb.pack()
     9 filemenu = Menu(mb,tearoff=0)
    10 filemenu.add_checkbutton(label="打开",command=call)
    11 filemenu.add_command(label="保存",command=call)
    12 filemenu.add_separator()
    13 filemenu.add_command(label="退出",command=root.quit)
    14 mb.config(menu=filemenu)
    15 mainloop()

    执行结果:

     

    通过点击“python3”调用filemenu,然后进行操作。

    OptionMenu组件

    OptionMenu(选项菜单)说白了就是一个下拉菜单的改版,只是弥补了Listbox组件无法实现下拉列表的遗憾。如果想要创建一个选择菜单,只需要一个Tkinter变量即可。

    1 from tkinter import *
    2 
    3 root = Tk()
    4 root.title("选择菜单")
    5 variable = StringVar()
    6 variable.set("python")
    7 w = OptionMenu(root,variable,"python","php","c#","c++")
    8 w.pack()
    9 mainloop()

    执行结果:

     

    选择菜单建好了,如果想根据自己的选择进行操作的话,我们可以使用Tkinter变量的get()方法。

     1 from tkinter import *
     2 
     3 root = Tk()
     4 root.title("选择菜单")
     5 variable = StringVar()
     6 variable.set("python")
     7 def call():
     8     print(variable.get())
     9 w = OptionMenu(root,variable,"python","php","c#","c++")
    10 w.pack()
    11 Button(root,text="点我",command=call).pack()
    12 mainloop()

    执行结果:

     

    最后演示一下如何将更多的选项添加到选项菜单中:

     1 from tkinter import *
     2 
     3 project = ["python3.6","java","go","php"]
     4 root = Tk()
     5 root.title("选择菜单")
     6 variable = StringVar()
     7 variable.set("python")
     8 def call():
     9     print(variable.get())
    10 w = OptionMenu(root,variable,*project)
    11 w.pack()
    12 Button(root,text="点我",command=call).pack()
    13 mainloop()

    执行结果:

  • 相关阅读:
    Unity核心对象模型
    自适应XAML布局经验总结 (四)区域布局设计模式
    自适应XAML布局经验总结 (三) 局部布局设计模式2
    自适应XAML布局经验总结 (二) 局部布局设计模式1
    自适应XAML布局经验总结 (一)原则和页面结构设计
    WPF核心对象模型-类图和解析
    谈谈XAML前端开发
    arpg网页游戏特效播放(一)
    arpg网页游戏之地图(四)
    arpg网页游戏之地图(三)
  • 原文地址:https://www.cnblogs.com/pinpin/p/10029032.html
Copyright © 2020-2023  润新知