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()
执行结果: