GUI的终极选择:Tkinter10: Menu && Menubutton&&OptionMenu

##Menu
   (由于该组件是由底层代码来实现的,并且已经优化好了,我们这里不建议你自行通过按钮或者其他的组件来实现菜单的功能,因为Python的开发原则就是有得用就别自己瞎搞,那是正式开发中,但是平时的学习偶尔搞搞也行,可以学到很多东西滴)
   ※Menu:Menu(菜单)组件用于实现顶级菜单、下拉菜单和弹出菜单。
   创建一个顶级菜单,实例化Menu组件接可以了,那么还是先来看看他长什么样吧

from tkinter import *

root = Tk()

def callback():
    print("你好~")

menubar = Menu(root)
menubar.add_command(label="hello",command=callback)
menubar.add_command(label="quit",command=root.quit)

root.config(menu=menubar)

mainloop()

在这里插入图片描述
   (解析:先实例化好一个Menubar菜单,第一个参数表示来自于root窗口,然后可以使用add_comman方法添加里边的内容,里边写了一个label,然后设置了一个command选项,调用回调函数,就是当点下hello,就会触发回调函数,接着又加了一个退出的label,此时运行只得到一个普通的窗口,因为这里菜单实例虽然出现了,但是我们没有把它添加到哪个窗口上,那么root窗口上会有一个menu的选项,我们可以用config方法把root窗口和创建好的菜单关联一下就可以了)

   下面来实现下拉列表,就是点了hello还有其他选项,而不是执行一个命令,即把它添加到主菜单上,而不是窗口上就可以了

from tkinter import *

root = Tk()

def callback():
    print("你好~")

menubar = Menu(root)

filemenu =Menu(menubar,tearoff=False)
filemenu.add_command(label="打开",command=callback)
filemenu.add_command(label="保存",command=callback)
filemenu.add_separator()
filemenu.add_command(label="退出",command=root.quit)
menubar.add_cascade(label="文件",menu=filemenu)


editmenu =Menu(menubar,tearoff=False)
editmenu.add_command(label="剪切",command=callback)
editmenu.add_command(label="拷贝",command=callback)
editmenu.add_command(label="粘贴",command=callback)

menubar.add_cascade(label="编辑",menu=editmenu)


root.config(menu=menubar)

mainloop()

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
   (解析:filemenu =Menu(menubar,tearoff=False)实例化的菜单不是放在root窗口了,而是放在主菜单menuvar中,也就是说这个下拉菜单他是单独的一个Menu实例,然后在往filemenu里边加内容就可以了,filemenu.add_separator()这个就是创建一个分割线,如上图左边保存和退出之间的那条线,分隔线主要的功能就是分割不同的功能,内容,工作区
   接着menubar.add_cascade(label=“文件”,menu=filemenu)创建了级联菜单,级联就是点了还有下一层选择,第二个参数menu选项就是要设置他的menu,也就是说跟他相关联的,他的下一级的菜单是哪个,就是filemenu,就跟刚才的第一个例子是差不多的,只是说他的从属发生了改变,下面就是再多创建了一个编辑选项

   然后这里可以发现,创建主菜单的时候设置了一个tearoff选项为False,如果设置为True,如上图,会有一行虚线,当我们点击虚线时就会被撕下,而且可以撕好多次,如上图)
   接着是使用post()可以弹出菜单

from tkinter import *

root = Tk()

def callback():
    print("你好~")

menubar = Menu(root)
menubar.add_command(label="撤销",command=callback)
menubar.add_command(label="重做",command=root.quit)

frame = Frame(root,width=512,height=512)
frame.pack()

def popup(event):
    menubar.post(event.x_root,event.y_root)
    
frame.bind("<Button-3>",popup)

root.config(menu=menubar)

mainloop()

在这里插入图片描述
   (解析:把主菜单弄好后,这里弄了个fame框架进行绑定,绑定了鼠标右键,绑定鼠标右键是<Button-3>),1是绑定左键,2是中间键,然后回调函数是popup,这个方法事实上就是调用menubar的post放,只要有menubar的 post,他就会在指定的位置弹出菜单,

   菜单不仅可以添加我们普通的命令行(add_command),事实上我们还可以添加像Checkbutton(多选按钮)还有 Radiobutton(单选按钮)这样子的菜单项,它们的用法就和 Checkbutton 和 Radiobutton 组件是差不多的,

from tkinter import *

root = Tk()

def callback():
    print("你好~")

menubar = Menu(root)

openVar = IntVar()
saveVar = IntVar()
quitVar = IntVar

filemenu =Menu(menubar,tearoff=False)
filemenu.add_checkbutton(label="打开",command=callback,variable=openVar)
filemenu.add_checkbutton(label="保存",command=callback,variable=saveVar)
filemenu.add_separator()
filemenu.add_checkbutton(label="退出",command=root.quit,variable=quitVar)
menubar.add_cascade(label="文件",menu=filemenu)


editVar = IntVar()


editmenu =Menu(menubar,tearoff=False)
editmenu.add_radiobutton(label="剪切",command=callback,variable=editVar,value=1)
editmenu.add_radiobutton(label="拷贝",command=callback,variable=editVar,value=2)
editmenu.add_radiobutton(label="粘贴",command=callback,variable=editVar,value=3)

menubar.add_cascade(label="编辑",menu=editmenu)


root.config(menu=menubar)

mainloop()

在这里插入图片描述在这里插入图片描述
   (解析:需要注意的是checkbutton他需要一个tkinter的变量,用来存放按钮的状态是被选中还是没选中,然后radiobutton没那么麻烦,只需要一个变量就可以了,但是他的选项不仅variable,还要有value,由截图可以看到,文件那栏的选项可以同时选三个,选完机会打钩,第二个只能选一个,他们是互斥的)

##Menubutton
   (这个组件是有一定的历史意义的,因为刚开始是没有顶级菜单的,那么就用 Menubutton 实现一个个按钮在上面,点一个按钮就出现菜单。Menu就有顶级菜单的出现,这个Menubutton就没什么用了,现在主要是用于在窗口某一位置创建一个按钮,点一下出现一个菜单,那么你就可用Menubutton)
   ※Menubutton:Menubutton 组件是一个与 Menu 组件相关联的按钮(事实上就是Menu加上Button),它可以放在窗口中的任意位置,并且在被按下时弹出下拉菜单。

   直接来看看一个Menubutton

from tkinter import *

root = Tk()

def callback():
    print("你好~")

    
mb = Menubutton(root,text="点我",relief=RAISED)
mb.pack()

filemenu =Menu(mb,tearoff=False)
filemenu.add_command(label="打开",command=callback)
filemenu.add_command(label="保存",command=callback)
filemenu.add_separator()
filemenu.add_command(label="退出",command=root.quit)


mb.config(menu=filemenu)

mainloop()

在这里插入图片描述
   (解析:实例化一个Menubutton,mb = Menubutton(root,text=“点我”,relief=RAISED),这些选项是跟button是一样的,第三个选项relief就是设置他的样式,"raised"表示按钮是一个浮起的样式,

##OptionMenu
   ※OptionMenu:OptionMenu(选择菜单)事实上是下拉菜单的改版,它的发明弥补了 Listbox 组件无法实现下拉列表框的遗憾。

   直接来看看一个OptionMenu:

from tkinter import *

root = Tk()

variable = StringVar()
variable.set("one")

w = OptionMenu(root,variable,"one","two","three")
w.pack()


mainloop()

在这里插入图片描述在这里插入图片描述
   (解析:先来创建一个tkinterd的变量,variable = StringVar(),然后再设置一下变量的默认值,接着实例化一个OptionMenu对象,后面的参数是可变参数,根据需要定义个数,再把他pack出来就可了

   下面再来一个如何将很多项添加到选择菜单中,就是很多选项在一个列表或者元组中,如何将他们添加到 OptionMenu 菜单中

from tkinter import *


OPTIONS = [
    "aaa",
    "bbb",
    "ccc",
    "ddd",
    "eee",
    "fff"
    ]


root = Tk()

variable = StringVar()
variable.set(OPTIONS[0])

w = OptionMenu(root,variable,*OPTIONS)
w.pack()



mainloop()

在这里插入图片描述
   (解析:我们知道,OptionMenu后面的选项是可变参数, 那假设前面拿到一个列表,这个列表很长,那现在问题是如何那个列表放进去,因为那个选项是可变参数,不可以直接把直接把列表扔进去,不然他会把整个列表当做一个选项,而不会说把列表自动拆开,自动拆开的话其实直接在前面加个*就可了,星号有个解包的功能

   星号(*)作为形参的时候是起到“打包”的作用,相反,作为实参的时候是起到“解包”的作用。

发布了247 篇原创文章 · 获赞 116 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/w15977858408/article/details/104201386