13、OptionMenu与Combobox
13-1 下拉式列表OptionMenu
OptionMenu可以翻译为下拉式列表,用户可以从中选择一项,它的构造方法如下。
OptionMenu(父对象, options, *value)其中,*value是一系列下拉列表,本节将通过实例进行讲解。
13-1-1 建立基本的OptionMenu
下面程序实例ch13_1,建立OptionMenu,这个下拉列表中有三个数据,分别是Python、Java、C。
from tkinter import * root = Tk() root.title("ch13_1") root.geometry("300x180") var = StringVar(root) optionmenu = OptionMenu(root, var, "Python", "Java", "C") optionmenu.pack() root.mainloop()执行结果 程序执行时OptionMenu中是空的,这是因为没有选择任何选项。
选择任一项后,选项会更改。
可以留意上述第8行建立OptionMenu下拉列表项目的方式。
13-1-2 使用元组建立列表项目
上述程序虽然可以建立列表,但是当列表中项目较多时,不是很方便,不过我们可以将列表项目建在元组内,再将元组数据放入OptionMenu()构造方法内。
下面程序实例ch13_2,重新设计ch13_1,使用元组存储列表项目。
from tkinter import * root = Tk() root.title("ch13_2") root.geometry("300x180") omTuple = ("Python", "Java", "C") var = StringVar(root) optionmenu = OptionMenu(root, var, *omTuple) # 创建OptionMenu optionmenu.pack() root.mainloop()执行结果 与ch13_1相同
13-1-3 建立默认选项set()
到目前,程序刚执行时,没有看到任何项目,不过我们可以使用set()方法为这个OptionMenu建立默认选项。
程序实例ch13_3,重新设计ch13_2,使用set()方法建立默认选项。
from tkinter import * root = Tk() root.title("ch13_3") root.geometry("300x180") omTuple = ("Python", "Java", "C") var = StringVar(root) var.set(omTuple[0]) optionmenu = OptionMenu(root, var, *omTuple) # 创建OptionMenu optionmenu.pack() root.mainloop()执行结果
13-1-4 获得选项内容get()
可以使用get()方法获得选项内容。
程序实例ch13_4:获得OptionMenu目前选项的内容,这个程序中提供了Print按钮,单击此按钮可以在Python Shell窗口中列出所选的内容。
from tkinter import * def printSelection(): print("The selection is: " + var.get()) root = Tk() root.title("ch13_4") root.geometry("300x180") omTuple = ("Python", "Java", "C") var = StringVar(root) var.set(omTuple[0]) optionmenu = OptionMenu(root, var, *omTuple) # 创建OptionMenu optionmenu.pack(pady=10) btn = Button(root, text="Print", command=printSelection) btn.pack(pady=10, anchor=S, side=BOTTOM) root.mainloop()执行结果
Python Shell打印了The election is: Python
13-2 组合框Combobox
Combobox可以翻译为组合框,这是tkinter.ttk的Widget控件,它的特性与OptionMenu类似,可以说它是Entry和下拉菜单的组合。它的构造方法如下。
Combobox(父对象, options)常用的options参数如下。
(1) textvariable:可以设置Combobox的变量值。
(2) value:Combobox的选项内容,内容以元组方式存在。
13-2-1 建立Combobox
在Combobox()构造方法中,可以使用value参数建立选项内容。
程序实例ch13_5:建立一个Combobox。
from tkinter import * from tkinter.ttk import * root = Tk() root.title("ch13_5") root.geometry("300x120") var = StringVar() cb = Combobox(root, textvariable=var, value=("Python", "Java", "C#", "C")) cb.pack() root.mainloop()执行结果
其实在设计上述程序时,若是选项很多,Combobox()方法的参数value一般是独立在Combobox()处处理,可以参考下列实例。
程序实例ch13_6:将Combobox的选项独立处理,可以参考第10行。
from tkinter import * from tkinter.ttk import * root = Tk() root.title("ch13_6") root.geometry("300x120") var = StringVar() cb = Combobox(root, textvariable=var) cb['values'] = ('Python', 'Java', 'C#', 'C') cb.pack() root.mainloop()执行结果 与上面相同。
13-2-2 设置默认选项current()
Combobox创建完成后,可以使用current()方法建立默认选项。
下面程序实例:设置元组索引0的元素Python为默认选项。
from tkinter import * from tkinter.ttk import * root = Tk() root.title("ch13_7") root.geometry("300x120") var = StringVar() cb = Combobox(root, textvariable=var) cb['values'] = ('Python', 'Java', 'C', 'C++', 'C#') cb.current(0) # 设置默认选项 cb.pack() root.mainloop()执行结果
在前面建立Combobox过程中有textvariable=var,此var在第8行创建,有了它就可以用var.set("xx")方式建立默认选项,当然对这个实例而言,使用current()方法较为便利。
下面程序实例ch13_8:重新设计ch13_7,使用var.set()建立默认选项。
var.set("Python")执行结果与ch13_7相同。
13-2-3 获得目前选项get()
在前面建立Combobox过程中有textvariable=var,可以使用var.get()获得目前选项的内容。
下面程序实例ch13_9:扩充设计ch13_7,增加Print按钮,当单击此按钮时可以在Python Shell窗口中打印此选项。
from tkinter import * from tkinter.ttk import * def printSelection(): print(var.get()) root = Tk() root.title("ch13_9") root.geometry("300x120") var = StringVar() cb = Combobox(root, textvariable=var) cb['values'] = ('Python', 'Java', 'C', 'C++', 'C#') cb.current(0) # 设置默认选项 cb.pack(pady=10) btn = Button(root, text="Print", command=printSelection) btn.pack(pady=10, anchor=S, side=BOTTOM) root.mainloop()执行结果
13-2-4 绑定Combobox
当Combobox中的选项有变动时,会产生虚拟<>事件,也可以使用这个特性将此事件绑定处理方法。
下面程序实例ch13_10:同步Combobox和Label的内容。
from tkinter import * from tkinter.ttk import * def comboSelection(event): labelVar.set(var.get()) root = Tk() root.title("ch13_10") root.geometry("300x120") var = StringVar() cb = Combobox(root, textvariable=var) cb['values'] = ('Python', 'Java', 'C', 'C++', 'C#') cb.current(0) cb.bind("<<ComboboxSelected>>", comboSelection) cb.pack(pady=10) labelVar = StringVar() label = Label(root, textvariable=labelVar) labelVar.set(var.get()) label.pack(side=LEFT) root.mainloop()执行结果