2022年 11月 5日

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

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

  1. from Tkinter import *
  2. root=Tk()
  3. root.geometry('300x100')
  4. M=Menu(root)
  5. #创建主菜单
  6. for i in ['File','View','Edit','Tools','Help']:
  7. M.add_command(label=i)
  8. # 将root的menu属性设置为M
  9. root['menu']=M
  10. root.mainloop()

add_command (options)方法:将菜单项添加到菜单中。

上面菜单无下拉,修改:

  1. from Tkinter import *
  2. root = Tk()
  3. def CallOn():
  4. print 'Hello'
  5. menubar = Menu(root)
  6. content=[['New File','Open File','Save'],['Undo','Copy','Cut']]
  7. Main=['File','Edit']
  8. for i in range(len(Main)):
  9. #新建一个空的菜单,将menubar的menu属性指定为filemenu,即filemenu为menubar的下拉菜单
  10. filemenu = Menu(menubar, tearoff=0)
  11. for k in content[i]:
  12. filemenu.add_command(label = k,command = CallOn)
  13. menubar.add_cascade(label=Main[i], menu=filemenu)
  14. root['menu'] = menubar
  15. root.mainloop()

tearoff属性通常情况下,菜单可以被撕掉,第一个位置(位置0)在选择列表中被删除元素占据,并且额外的选择从位置1开始。如果您设置了tearoff=0,菜单将不会有一个tearoff特性,并且选择将从位置0开始添加。

add_cascade()方法:通过将给定的菜单与父菜单相关联,创建一个新的分层菜单。

向菜单中添加Checkbutton

  1. # 程序运行,使用了Checkbutton,并通过printItem将每个Checkbutton在当前值打印出来。
  2. from Tkinter import *
  3. root = Tk()
  4. # 每次打印出各个变量的当前值
  5. def printItem():
  6. print 'Python = ', vPython.get()
  7. print 'PHP = ', vPHP.get()
  8. print 'CPP = ', vCPP.get()
  9. print 'C = ', vC.get()
  10. print 'Java = ', vJava.get()
  11. print 'JavaScript = ', vJavaScript.get()
  12. print 'VBScript = ', vVBScript.get()
  13. menubar = Menu(root)
  14. vPython = StringVar()
  15. vPHP = StringVar()
  16. vCPP = StringVar()
  17. vC = StringVar()
  18. vJava = StringVar()
  19. vJavaScript = StringVar()
  20. vVBScript = StringVar()
  21. filemenu = Menu(menubar, tearoff=0)
  22. # item()方法把字典中每对key和value组成一个元组,并把这些元组放在列表中返回。
  23. for k, v in {'Python': vPython,
  24. 'PHP': vPHP,
  25. 'CPP': vCPP,
  26. 'C': vC,
  27. 'Java': vJava,
  28. 'JavaScript': vJavaScript,
  29. 'VBScript': vVBScript}.items():
  30. # 绑定变量与回调函数
  31. filemenu.add_checkbutton(label=k, command=printItem, variable=v)
  32. # 将menubar的menu属性指定为filemenu,即filemenu为menubar的下拉菜单
  33. menubar.add_cascade(label='Language', menu=filemenu)
  34. root['menu'] = menubar
  35. root.mainloop()

add_checkbutton( options )方法:创建一个检查按钮菜单项。(多选)

向菜单 中添加Radiobutton

将上面的add_checkbutton()函数改为add_radiobutton()函数即可,

修改一下:

  1. from Tkinter import *
  2. root = Tk()
  3. menubar = Menu(root)
  4. vLang = StringVar()
  5. #每次打印出当前选中的语言
  6. def printItem():
  7. print 'vLang = ',vLang.get()
  8. Language=['Language','Program']
  9. L=[['Chinese','English','Japanese'],['Python','PHP','CPP','C','Java','JavaScript','VBScript']]
  10. for i in range(len(Language)):
  11. filemenu = Menu(menubar, tearoff=0)
  12. #将menubar的menu属性指定为filemenu,即filemenu为menubar的下拉菜单
  13. menubar.add_cascade(label=Language[i], menu=filemenu)
  14. for k in L[i] :
  15. #绑定变量与回调函数,指定的变量vLang将这几项划为一组
  16. filemenu.add_radiobutton(label = k,command = printItem,variable = vLang)
  17. # 将各个菜单项使用分隔符隔开
  18. filemenu.add_separator()
  19. # filemenu = Menu(menubar, tearoff=2)
  20. root['menu'] = menubar
  21. root.mainloop()

add_separator()方法:在菜单中添加分隔线。
 

以上是下拉菜单,接下来是右拉菜单。

  1. from Tkinter import *
  2. def donothing():
  3. filewin = Toplevel(root)
  4. button = Button(filewin, text="Do nothing button")
  5. button.pack()
  6. root = Tk()
  7. menubar = Menu(root)
  8. filemenu = Menu(menubar, tearoff=0)
  9. #使用add_commanf一个个添加菜单
  10. filemenu.add_command(label="New", command=donothing)
  11. filemenu.add_command(label="Open", command=donothing)
  12. filemenu.add_command(label="Save", command=donothing)
  13. filemenu.add_command(label="Save as...", command=donothing)
  14. filemenu.add_command(label="Close", command=donothing)
  15. #使用分隔符
  16. filemenu.add_separator()
  17. filemenu.add_command(label="Exit", command=root.quit)
  18. #级联,#新建一个空的菜单,将menubar的menu属性指定为filemenu,即filemenu为menubar的下拉菜单
  19. menubar.add_cascade(label="File", menu=filemenu)
  20. #编辑菜单栏
  21. editmenu = Menu(menubar, tearoff=0)
  22. editmenu.add_command(label="Undo", command=donothing)
  23. editmenu.add_separator()
  24. editmenu.add_command(label="Cut", command=donothing)
  25. editmenu.add_command(label="Copy", command=donothing)
  26. editmenu.add_command(label="Paste", command=donothing)
  27. editmenu.add_command(label="Delete", command=donothing)
  28. editmenu.add_command(label="Select All", command=donothing)
  29. menubar.add_cascade(label="Edit", menu=editmenu)
  30. #帮助菜单栏
  31. helpmenu = Menu(menubar, tearoff=0)
  32. helpmenu.add_command(label="Help Index", command=donothing)
  33. helpmenu.add_command(label="About...", command=donothing)
  34. menubar.add_cascade(label="Help", menu=helpmenu)
  35. #将root的menu属性设置为menubar
  36. root.config(menu=menubar)
  37. 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}

  1. from Tkinter import *
  2. root = Tk()
  3. v = StringVar(root)
  4. v.set('Python')
  5. om = OptionMenu(root,v,'Python','PHP','CPP','C','Java','JavaScript','VBScript')
  6. om.pack()
  7. # print help(OptionMenu)
  8. root.mainloop()

修改不设初始值:

  1. from Tkinter import *
  2. root = Tk()
  3. v = StringVar(root)
  4. #创建一个OptionMenu控件
  5. om = OptionMenu(root,
  6. v,
  7. 'Python',
  8. 'PHP',
  9. 'CPP',
  10. 'C',
  11. 'Java',
  12. 'JavaScript',
  13. 'VBScript'
  14. )
  15. om.pack()
  16. root.mainloop()
  17. #OptionMenu的创建需要两个必要的参数,与当前值绑定的变量,通常为一StringVar类型;另一
  18. #个是提供可选的内容列表,由OptionMenu的变参数指定。

设置OptionMenu的显示值

#当OptionMenu与变量绑定后,直接使用变量赋值的方法即可改变当前的值
  1. #当OptionMenu与变量绑定后,直接使用变量赋值的方法即可改变当前的值
  2. from Tkinter import *
  3. root = Tk()
  4. v = StringVar(root)
  5. #创建一个OptionMenu控件
  6. v.set('Language')
  7. om = OptionMenu(root,
  8. v,
  9. 'Python',
  10. 'PHP',
  11. 'CPP',
  12. 'C',
  13. 'Java',
  14. 'JavaScript',
  15. 'VBScript'
  16. )
  17. om.pack()
  18. # 运行程序,OptionMenu默认值为"Language",打印出的数值也为"Language
  19. print v.get()
  20. root.mainloop()

若想获得每次点击的选项,用bind绑定函数

  1. from Tkinter import *
  2. root = Tk()
  3. v = StringVar(root)
  4. def Print(event):
  5. print v.get()
  6. #创建一个OptionMenu控件
  7. v.set('Language')
  8. om = OptionMenu(root,
  9. v,
  10. 'Python',
  11. 'PHP',
  12. 'CPP',
  13. 'C',
  14. 'Java',
  15. 'JavaScript',
  16. 'VBScript'
  17. )
  18. om.pack()
  19. # 添加事件函数
  20. om.bind('<Button-1>',Print)
  21. root.mainloop()