Menu
顶级菜单 -- 先创建一个菜单实例,然后使用 add() 方法将命令和其它子菜单添加进去.
root = Tk()
menubar = Menu(root)
menubar.add_command(label='File', command=xxx)
NOTE: 由于该组件是底层代码实现,所以不建议你自行通过按钮和其他组件来实现菜单功能。
子菜单 -- 创建方法也是大同小异,最主要的区别是它们最后需要添加到主菜单上(而不是窗口上)。
Filemenu=Menu(menubar, tearoff=FALSE) --- tearoff表示是否将菜单弹出到单独窗口
弹出菜单 -- 创建方法也是一致的,不过需要使用 post() 方法明确的将其显示出来,而且需要把鼠标事件和一个frame绑定
Menubutton() -- 该组件适用于你希望菜单按钮出现在其他位置的时候, 存在于Tkinter 的早期版本
创建一个 Menubutton 组件,并创建一个 Menu 组件与之相关联
OptionMenu(选择菜单)-- 下拉菜单的改版,它的发明弥补了 Listbox 组件无法实现下拉列表框的遗憾。
将一个列表加到optionmenu中,使用*[list]进行解包
注意:星号(*)作为形参的时候是起到“打包”的作用,相反,作为实参的时候是起到“解包”的作用。
从两个示例的输出可以看出:
当参数形如 *args 时,传递给函数的任意个实参会按位置打包成一个元组(tuple);
def fun1(*args):
print(type(args))
print(args)
当参数形如 **args 时,传递给函数的任意个 key = value 实参会被包装进一个字典(dict)。
def fun2(**args):
print(type(args))
print(args)
有打包就有解包,通过在实参前加一个星号(*)或两个星号(**)来对列表(list)、元组(tuple)或字典(dict)进行解包
>>> a = [1, 2, 3, 4, 5]
>>> fun1(*a)
(1, 2, 3, 4, 5)
>>> c = {'one':1, 'two':2, 'three':3}
>>> fun2(**c)
{'two': 2, 'one': 1, 'three': 3}
from tkinter import *
root = Tk()
menubar = Menu(root) # 创建一个menu实例
def callback():
print('Workhuman!')
# 创建层级菜单
filemenu = Menu(menubar, tearoff=False)
filemenu.add_command(label='Open', command=callback)
filemenu.add_command(label='Save', command=callback)
filemenu.add_separator()
filemenu.add_command(label='Quit', command=root.quit)
menubar.add_cascade(label='File', menu=filemenu) # 关联上级菜单
# 层级菜单含有checkbutton
var = IntVar()
var1 = IntVar()
helpmenu = Menu(menubar, tearoff=True)
helpmenu.add_checkbutton(label='Online Help', variable=var, command=callback)
helpmenu.add_checkbutton(label='About', variable=var1, command=root.quit)
menubar.add_cascade(label='Help', menu=helpmenu)
# 右键单击弹出菜单
popupmenu = Menu(root)
def popup(event): # 绑定点击事件
popupmenu.post(event.x_root, event.y_root)
# 含有radiobutton
var2 = IntVar()
popupmenu.add_radiobutton(label='Copy', variable=var2, value=1, command=callback)
popupmenu.add_radiobutton(label='Delete', variable=var2, value=2, command=callback)
popupmenu.add_radiobutton(label='Paste', variable=var2, value=3, command=callback)
frame = Frame(root, width=300, height=200)
frame.pack()
frame.bind('<B3-Motion>', popup)
# 创建页面中的菜单键menubutton
mb = Menubutton(root, text='Click me', relief=RAISED, width=10, height=5)
mb.pack()
mm = Menu(mb, tearoff=False)
mm.add_command(label='Who', command=callback)
mm.add_command(label='Why', command=callback)
mb.config(menu=mm)
# 创建可选菜单optionmenu
cars = [
'Fradi',
'Audi',
'Benz',
'BMW',
'Bugadi'
]
var3 = StringVar()
var3.set(cars[2])
om = OptionMenu(root, var3, *cars) # 解包
om.pack()
def getvalue():
print(var3.get())
Button(text='Get', command=getvalue).pack()
root.config(menu=menubar)
mainloop()