在用户界面程序中, 菜单以图标和文字的方式展示可用选项. 用鼠标选择一个选项, 程序的某个行为既被触发. 这种行为通常包括比如 打开/保存文件, 退出程序 等功能.
上下文菜单是一种根据用户当前所在程序位置(上下文), 动态生成的菜单.
简单程序:
from Tkinter import *
root=Tk()
root.geometry('300x100')
M=Menu(root)
#创建主菜单
for i in ['File','View','Edit','Tools','Help']:
M.add_command(label=i)
# 将root的menu属性设置为M
root['menu']=M
root.mainloop()
add_command (options)方法:将菜单项添加到菜单中。
上面菜单无下拉,修改:
from Tkinter import *
root = Tk()
def CallOn():
print 'Hello'
menubar = Menu(root)
content=[['New File','Open File','Save'],['Undo','Copy','Cut']]
Main=['File','Edit']
for i in range(len(Main)):
#新建一个空的菜单,将menubar的menu属性指定为filemenu,即filemenu为menubar的下拉菜单
filemenu = Menu(menubar, tearoff=0)
for k in content[i]:
filemenu.add_command(label = k,command = CallOn)
menubar.add_cascade(label=Main[i], menu=filemenu)
root['menu'] = menubar
root.mainloop()
tearoff属性:通常情况下,菜单可以被撕掉,第一个位置(位置0)在选择列表中被删除元素占据,并且额外的选择从位置1开始。如果您设置了tearoff=0,菜单将不会有一个tearoff特性,并且选择将从位置0开始添加。
add_cascade()方法:通过将给定的菜单与父菜单相关联,创建一个新的分层菜单。
向菜单中添加Checkbutton项
# 程序运行,使用了Checkbutton,并通过printItem将每个Checkbutton在当前值打印出来。
from Tkinter import *
root = Tk()
# 每次打印出各个变量的当前值
def printItem():
print 'Python = ', vPython.get()
print 'PHP = ', vPHP.get()
print 'CPP = ', vCPP.get()
print 'C = ', vC.get()
print 'Java = ', vJava.get()
print 'JavaScript = ', vJavaScript.get()
print 'VBScript = ', vVBScript.get()
menubar = Menu(root)
vPython = StringVar()
vPHP = StringVar()
vCPP = StringVar()
vC = StringVar()
vJava = StringVar()
vJavaScript = StringVar()
vVBScript = StringVar()
filemenu = Menu(menubar, tearoff=0)
# item()方法把字典中每对key和value组成一个元组,并把这些元组放在列表中返回。
for k, v in {'Python': vPython,
'PHP': vPHP,
'CPP': vCPP,
'C': vC,
'Java': vJava,
'JavaScript': vJavaScript,
'VBScript': vVBScript}.items():
# 绑定变量与回调函数
filemenu.add_checkbutton(label=k, command=printItem, variable=v)
# 将menubar的menu属性指定为filemenu,即filemenu为menubar的下拉菜单
menubar.add_cascade(label='Language', menu=filemenu)
root['menu'] = menubar
root.mainloop()
add_checkbutton( options )方法:创建一个检查按钮菜单项。(多选)
向菜单 中添加Radiobutton项
将上面的add_checkbutton()函数改为add_radiobutton()函数即可,
修改一下:
from Tkinter import *
root = Tk()
menubar = Menu(root)
vLang = StringVar()
#每次打印出当前选中的语言
def printItem():
print 'vLang = ',vLang.get()
Language=['Language','Program']
L=[['Chinese','English','Japanese'],['Python','PHP','CPP','C','Java','JavaScript','VBScript']]
for i in range(len(Language)):
filemenu = Menu(menubar, tearoff=0)
#将menubar的menu属性指定为filemenu,即filemenu为menubar的下拉菜单
menubar.add_cascade(label=Language[i], menu=filemenu)
for k in L[i] :
#绑定变量与回调函数,指定的变量vLang将这几项划为一组
filemenu.add_radiobutton(label = k,command = printItem,variable = vLang)
# 将各个菜单项使用分隔符隔开
filemenu.add_separator()
# filemenu = Menu(menubar, tearoff=2)
root['menu'] = menubar
root.mainloop()
add_separator()方法:在菜单中添加分隔线。
以上是下拉菜单,接下来是右拉菜单。
from Tkinter import *
def donothing():
filewin = Toplevel(root)
button = Button(filewin, text="Do nothing button")
button.pack()
root = Tk()
menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)
#使用add_commanf一个个添加菜单
filemenu.add_command(label="New", command=donothing)
filemenu.add_command(label="Open", command=donothing)
filemenu.add_command(label="Save", command=donothing)
filemenu.add_command(label="Save as...", command=donothing)
filemenu.add_command(label="Close", command=donothing)
#使用分隔符
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.quit)
#级联,#新建一个空的菜单,将menubar的menu属性指定为filemenu,即filemenu为menubar的下拉菜单
menubar.add_cascade(label="File", menu=filemenu)
#编辑菜单栏
editmenu = Menu(menubar, tearoff=0)
editmenu.add_command(label="Undo", command=donothing)
editmenu.add_separator()
editmenu.add_command(label="Cut", command=donothing)
editmenu.add_command(label="Copy", command=donothing)
editmenu.add_command(label="Paste", command=donothing)
editmenu.add_command(label="Delete", command=donothing)
editmenu.add_command(label="Select All", command=donothing)
menubar.add_cascade(label="Edit", menu=editmenu)
#帮助菜单栏
helpmenu = Menu(menubar, tearoff=0)
helpmenu.add_command(label="Help Index", command=donothing)
helpmenu.add_command(label="About...", command=donothing)
menubar.add_cascade(label="Help", menu=helpmenu)
#将root的menu属性设置为menubar
root.config(menu=menubar)
root.mainloop()
OptionMenu
OptionMenu类是一个辅助类,它用来创建弹出菜单,并且有一恶搞按钮显示它。它非常类似Windows上的下拉列表插件。
如果要获取当前选项菜单的值,你需要把它和一个Tkinter变量联系起来。
def __init__(self, master, variable, value, *values, **kwargs):
"""
构造一个带有父主的optionmenu小部件,将资源文本变量设置为变量,初始选择的值值,另一个菜单值值和一个附加值关键字参数命令。
""" kw = {"borderwidth": 2, "textvariable": variable, "indicatoron": 1, "relief": RAISED, "anchor": "c", "highlightthickness": 2}
from Tkinter import *
root = Tk()
v = StringVar(root)
v.set('Python')
om = OptionMenu(root,v,'Python','PHP','CPP','C','Java','JavaScript','VBScript')
om.pack()
# print help(OptionMenu)
root.mainloop()
修改不设初始值:
from Tkinter import *
root = Tk()
v = StringVar(root)
#创建一个OptionMenu控件
om = OptionMenu(root,
v,
'Python',
'PHP',
'CPP',
'C',
'Java',
'JavaScript',
'VBScript'
)
om.pack()
root.mainloop()
#OptionMenu的创建需要两个必要的参数,与当前值绑定的变量,通常为一StringVar类型;另一
#个是提供可选的内容列表,由OptionMenu的变参数指定。
设置OptionMenu的显示值
#当OptionMenu与变量绑定后,直接使用变量赋值的方法即可改变当前的值
#当OptionMenu与变量绑定后,直接使用变量赋值的方法即可改变当前的值
from Tkinter import *
root = Tk()
v = StringVar(root)
#创建一个OptionMenu控件
v.set('Language')
om = OptionMenu(root,
v,
'Python',
'PHP',
'CPP',
'C',
'Java',
'JavaScript',
'VBScript'
)
om.pack()
# 运行程序,OptionMenu默认值为"Language",打印出的数值也为"Language
print v.get()
root.mainloop()
若想获得每次点击的选项,用bind绑定函数
from Tkinter import *
root = Tk()
v = StringVar(root)
def Print(event):
print v.get()
#创建一个OptionMenu控件
v.set('Language')
om = OptionMenu(root,
v,
'Python',
'PHP',
'CPP',
'C',
'Java',
'JavaScript',
'VBScript'
)
om.pack()
# 添加事件函数
om.bind('<Button-1>',Print)
root.mainloop()