菜单通常位于窗口标题栏下方,将操作的相关指令集结,只要用户单击某个指令,就能执行相关的处理过程。要产生菜单,就得使用Menu控件,不过Menu控件只能产生菜单的骨架,还必须配合Menu控件的相关方法。
在开始制作菜单之前,先来认识下菜单的组成。
- 主菜单项:Python中称为pulldownmenu(下拉菜单)。要产生下拉菜单,可用Menu控件的add_cascade()方法协助
- 下拉菜单项(第二层菜单):有了主菜单项之后才能继续设置下拉菜单项。例如位于File主菜单的下拉菜单项有Open、Save等。这些菜单有点像按钮,可调用add_command()方法来处理。也有可能是一个群组,只能单选其中一个,add_Radiobutton()方法就符合这种需求。
- 分割线:下拉菜单项之间若要进行分隔,则可调用add_separator()方法加入分割线。
- 快捷键:对应下拉菜单项,用Accelecrator key来表示。根据它的设置能够快速执行某个菜单项对应的指令。
下表列出了Menu控件的有关方法:
方法 | 说明 |
---|---|
activate(index) | 动态方法 |
add(type,**options) | 增加菜单项 |
add_cascade(**options) | 增加主菜单项 |
add_checkbutton(**options) | 加入checkbutton(复选按钮或复选框) |
add_command(**options) | 以按钮形式添加子菜单项 |
add_radiobutton(**options) | 以单选按钮形式添加子菜单项 |
add_separator(**options) | 加入分割线,用于菜单之间 |
add()方法中的参数type可用来指定菜单的种类,包括command、cascade(submenu)、checkbutton、radiobutton、separator等
至于如何使用menu控件来产生菜单,可参考以下步骤
1.先创建主窗口对象,再把menu控件放入主窗口中,接着用menu控件的实例menubar来存储
root = Tk()
menubar = Menu(root) # 将Menu控件加入主窗口,产生菜单骨架
2.将菜单对象menubar布置到主窗口的顶部,并显示于界面中
root.config(menu = menubar) # 显示菜单
3.加入主菜单项
menu_file = Menu(menuBar,tearoff = 0)
创建主菜单项menu_file并加入到menubar(菜单栏对象)中,将tearoff值设为0,避免第一个子菜单项的上方有虚线
4.调用add_cascade()方法产生主菜单项的实例
menuBar.add_casscade(label = 'File',menu=menu_file)
通常到此步骤才能看到菜单显示于主窗口中。调用add_cascade()产生主菜单项时,用label设置其名称,将menu_file赋值内menu,如此添加的菜单项File才能真正加入菜单栏对象menuBar。
5.加入下拉菜单的菜单项
filemenu.add_command(label='Open',command = OpenFile)
有了主菜单项File之后,调用add_command()方法以按钮性质产生下拉菜单的菜单项,因为时按钮,所以参数command要有响应方法进行响应。
下面用实例来说明如何用Menu控件创建菜单。
from tkinter import *
# 定义响应函数
def newFile():
print('New File!')
def openFile():
print('Open File!')
def saveFile():
print('Save File!')
def About():
print('这是一个帮助菜单')
# 主窗口对象
win = Tk()
win.title('菜单')
# Step1.产生菜单对象menuBar,加到主窗口对象中
menuBar = Menu(win)
# Step2 将菜单对象menubar布置到主窗口的顶部,显示于界面中
win.config(menu=menuBar)
# Step3 加入主菜单项
menu_file = Menu(menuBar, tearoff=0)
menu_font = Menu(menuBar, tearoff=0)
menu_help = Menu(menuBar, tearoff=0)
# Step4 调用add_cascade()方法产生主菜单项的实例
menuBar.add_cascade(label='文件', menu=menu_file)
menuBar.add_cascade(label='字体', menu=menu_font)
menuBar.add_cascade(label='在线帮助', menu=menu_help)
# Step5 加入下拉菜单的菜单项
# File菜单
menu_file.add_command(label='新建', command=newFile)
menu_file.add_command(label='打开', command=openFile, underline=1, accelerator='Ctrl+O')
menu_file.add_separator() # 加入分割线
menu_file.add_command(label='保存', command=saveFile)
menu_file.add_separator() # 加入分割线
menu_file.add_command(label='退出', command=lambda: win.destroy())
# Font菜单
labels = (12, 14, 16, 18)
for item in labels:
menu_font.add_radiobutton(label=item)
# 帮助菜单
menu_help.add_command(label='关于', command=About)
mainloop()