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