一、前言
几乎每个应用程序都可以看到菜单,菜单有一级菜单和二级菜单等等。
Tkinter提供了一个Menu组件,用于实现顶级菜单、下拉菜单和弹出菜单。由于该组件是底层代码实现和优化,所以不建议自行通过按钮和其他组件来实现菜单功能。
创建一个顶级菜单,需要先创建一个菜单实例,然后使用add()方法将命令和其他子菜单添加进去。
创建一个下拉菜单(或者其他子菜单),方法同创建顶级菜单大同小异,最主要区别是下拉菜单最后需要添加到主菜单上(而不是窗口上)。
二、Menu使用实例:创建顶级菜单
代码实现
from tkinter import *
root= Tk()
def callback():
print("helloworld")
menubar = Menu(root) #创建一个顶级菜单
menubar.add_command(label = "你好",command = callback)
menubar.add_command(label = "退出",command = root.quit)
#显示菜单
root.config(menu = menubar)
mainloop()
运行见图5-1
这里我们可以看到,只是实现了一级菜单,如果要在一级菜单下实现多级菜单呢?方法如下:
三、多级菜单创建实例
代码实现:
#我们创建一个多级菜单
from tkinter import *
root = Tk()
def callback1():
print("打开")
def callback2():
print("关闭")
def callback3():
print("退出")
def callback4():
print("剪贴")
def callback5():
print("拷贝")
def callback6():
print("粘贴")
menubar = Menu(root) #创建一个顶级菜单
filemenu = Menu(menubar,tearoff = False) #创建一个顶级菜单下的子菜单
menubar.add_cascade(label = "文件",menu = filemenu) #为子菜单起个名字
filemenu.add_command(label = "打开",command = callback1)
filemenu.add_command(label = "关闭",command = callback2)
filemenu.add_separator() #增加分隔符
filemenu.add_command(label = "退出",command = callback3)
editmenu = Menu(menubar,tearoff = False)
menubar.add_cascade(label = "编辑",menu = editmenu)
editmenu.add_command(label = "剪贴",command = callback4)
editmenu.add_command(label = "拷贝",command = callback5)
editmenu.add_command(label = "粘贴",command = callback6)
#显示菜单
root.config(menu = menubar)
mainloop()
运行见图5-2
四、为菜单添加单选或多选按钮
下面我们结合之前学习的Checkbutton和Radiobutton组件来为菜单添加单选或多选标签,同时获取标签值,写进变量。(只需将二中的add_command替换为add_checkbutton或add_checkbutton即可)
代码实现:
from tkinter import *
root = Tk()
def callback1():
print("打开")
print(openVar.get())
def callback2():
print("关闭")
print(closeVar.get())
def callback3():
print("退出")
print(exitVar.get())
def callback4():
print("剪贴")
print(editVar.get())
def callback5():
print("拷贝")
print(editVar.get())
def callback6():
print("粘贴")
print(editVar.get())
#创建checkbutton关联变量
openVar = IntVar()
closeVar = IntVar()
exitVar = IntVar()
menubar = Menu(root) #创建一个顶级菜单
filemenu = Menu(menubar,tearoff = False) #创建一个顶级菜单下的子菜单
menubar.add_cascade(label = "文件",menu = filemenu) #为子菜单起个名字
filemenu.add_checkbutton(label = "打开",command = callback1,variable = openVar)
filemenu.add_checkbutton(label = "关闭",command = callback2,variable = closeVar)
filemenu.add_separator() #增加分隔符
filemenu.add_checkbutton(label = "退出",command = callback3,variable = exitVar)
#创建radiobutton关联变量
editVar = IntVar()
editVar.set(1)
editmenu = Menu(menubar,tearoff = False)
menubar.add_cascade(label = "编辑",menu = editmenu)
editmenu.add_radiobutton(label = "剪贴",command = callback4,variable = editVar,value = 1)
editmenu.add_radiobutton(label = "拷贝",command = callback5,variable = editVar,value = 2)
editmenu.add_radiobutton(label = "粘贴",command = callback6,variable = editVar,value = 3)
#显示菜单
root.config(menu = menubar)
mainloop()
运行图见5-3和5-4
五、运行
图5-1
图5-2
图5-3(多选标签)
图5-4(单选标签)
六、结语
如您在使用过程中有任何问题,请加QQ群进一步交流。
QQ交流群:906015840 (备注:物联网项目交流)。
获取资料:微信扫描下方二维码,关注公众号:一个物联网项目的前世今生,回复tkinter即可。
静晨出品:静之所想,晨之所计