在用户界面程序中, 菜单以图标和文字的方式展示可用选项. 用鼠标选择一个选项, 程序的某个行为既被触发. 这种行为通常包括比如 打开/保存文件, 退出程序 等功能.
上下文菜单是一种根据用户当前所在程序位置(上下文), 动态生成的菜单.
简单程序:
- 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()