7.菜单栏

任何GUI都少不了菜单,tkinter当然也有自己的菜单栏。tkinter使用Menu类创建一个菜单,并用add_command方法来添加菜单项。

下面让我们来创建顶层菜单:



from tkinter import *

root = Tk()
menubar = Menu(root)
for i in ['文件','视图','编辑','关于']:
    menubar.add_command(label=i)
#这一步不可或缺,菜单实例要应用到窗口中
root['menu']=menubar
root.mainloop()





Python tkinter参数更新 tkinter root.update_Python tkinter参数更新


图7.1 顶层菜单

add_command有下面几个属性:  

  • label:指定菜单的名称
  • command:被点击时调用的方法
  • acceletor:快捷键
  • underline:是否拥有下划线

通常,顶层菜单是应用到窗口的父组件,要想继续创建子菜单,需要同时用到add_command和add_cascade方法。例如:


from tkinter import *

root = Tk()
menubar = Menu(root)
#创建子菜单
fmenu = Menu(menubar)
for i in ['新建','打开','保存','另存为']:
    fmenu.add_command(label=i)
#为顶级菜单实例添加菜单,并级联相应的子菜单实例
menubar.add_cascade(label='文件',menu=fmenu)
menubar.add_cascade(label='视图')  #这里省略了menu属性,没有将后面三个选项与子菜单级联
menubar.add_cascade(label='编辑')
menubar.add_cascade(label='关于')

root['menu']=menubar
root.mainloop()


Python tkinter参数更新 tkinter root.update_tkinter 菜单添加事件_02

图7.2 子菜单


由此可见,我们需要通过add_cascade方法级联子菜单和顶层菜单。在子菜单存在时,也不需要利用for循环先创建好顶层菜单的每个选项,与子菜单一一对应即可。(代码中省略了后面三个选项的级联,只是显示了菜单的选项名称。)

add_separator()方法可以添加分割线,调用的时候很简单,需要在哪添加,就把这行代码放在那个地方:


from tkinter import *

root = Tk()
menubar = Menu(root)
fmenu = Menu(menubar)
for i in ['新建','打开','保存','另存为']:
    fmenu.add_command(label=i)
    
fmenu.add_separator()
fmenu.add_command(label='分割线')

menubar.add_cascade(label='文件',menu=fmenu)
menubar.add_cascade(label='视图')
menubar.add_cascade(label='编辑')
menubar.add_cascade(label='关于')
root['menu']=menubar
root.mainloop()


Python tkinter参数更新 tkinter root.update_子菜单_03

图7.3 分割线

除了默认的点击后无显示的效果,Menu还可以设置单选框(add_radiobutton)与复选框(add_checkbutton),只需对应地替换掉add_command,例如复选框的实现:


from tkinter import *

root = Tk()
menubar = Menu(root)
fmenu = Menu(menubar)
for i in ['新建','打开','保存','另存为']:
    fmenu.add_checkbutton(label=i)
menubar.add_cascade(label='文件',menu=fmenu)
menubar.add_cascade(label='视图')
menubar.add_cascade(label='编辑')
menubar.add_cascade(label='关于')
root['menu']=menubar
root.mainloop()


Python tkinter参数更新 tkinter root.update_级联_04

图7.4 复选框

除了最基本的窗口菜单,tkinter还可以实现弹出菜单。由于通常用右键触发,因此也叫右键菜单。不过这并不是一个独立的实现方法,而是将Menu类与鼠标事件结合,创建好菜单后,使用post方法在指定位置弹出已创建的菜单:


from tkinter import *

#菜单弹出事件
def pop(event):
    menubar.post(event.x_root, event.y_root)
    
root = Tk()
menubar = Menu(root)
for i in ['c','java','python','php']:
    menubar.add_command(label=i)
root.bind("<Button-3>",pop)
root.mainloop()


Python tkinter参数更新 tkinter root.update_子菜单_05

图7.5 弹出菜单

比较遗憾的是,tkinter的菜单栏只有默认的样式,但Menu和其他组件一样,可以通过一些通用属性来改变字体、颜色等等,不过也仅此而已了。

看了上面那么多的演示图,你有没有想过子菜单的长虚线有什么作用呢?这里我要介绍一个Menu特有的属性:

  • tearoff 点击子菜单中的 ---------,可以将其“撕下“,默认为True,设为False关闭


Python tkinter参数更新 tkinter root.update_级联_06

图7.6 ”撕下“菜单


关于菜单的内容就先介绍这么多,下一节我们来介绍各种对话框和消息框。