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()

执行结果:

猜你喜欢

转载自www.cnblogs.com/pinpin/p/10029032.html
今日推荐