Python的GUI编程(九)Menu(菜单)OptionMenu(为可选菜单)

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

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()

Python的GUI编程(九)Menu(菜单)OptionMenu(为可选菜单)_第1张图片

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()

Python的GUI编程(九)Menu(菜单)OptionMenu(为可选菜单)_第2张图片
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()

Python的GUI编程(九)Menu(菜单)OptionMenu(为可选菜单)_第3张图片

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()

Python的GUI编程(九)Menu(菜单)OptionMenu(为可选菜单)_第4张图片

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()

Python的GUI编程(九)Menu(菜单)OptionMenu(为可选菜单)_第5张图片

修改不设初始值:

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('',Print)

root.mainloop()



你可能感兴趣的:(Python)