Combobox 是一个结合了文本输入框和下拉列表功能的控件,用户既可以输入文本,也可以从下拉列表中选择一个选项,它在 tkinter.ttk 模块中提供,是 ttk(Themed Tkinter)的一部分,提供了比旧版 tkinter 更现代的外观。

基本用法
我们需要导入必要的模块并创建一个主窗口。
import tkinter as tk
from tkinter import ttk
# 创建主窗口
root = tk.Tk()"Combobox 基本用法示例")
root.geometry("300x200")
# 1. 创建 Combobox
# values 参数用于设置下拉列表的选项
combobox = ttk.Combobox(root, values=["选项 1", "选项 2", "选项 3", "选项 4"])
# 2. 将 Combobox 放置到窗口上
combobox.pack(pady=20, padx=20)
# 3. 设置默认选中的值
combobox.current(0) # 设置第一个选项为默认选中
# 运行主循环
root.mainloop()
代码解释:
import tkinter as tk和from tkinter import ttk: 导入 Tkinter 的核心模块和ttk模块。root = tk.Tk(): 创建一个主窗口。ttk.Combobox(root, values=[...]): 创建一个 Combobox 控件。root: 指定父窗口。values: 一个列表或元组,包含了下拉列表中显示的所有选项。
combobox.pack(...): 使用pack布局管理器将 Combobox 显示在窗口中。combobox.current(0): 重要方法,用于设置 Combobox 的默认选中项,参数0表示选择列表中的第一个元素,你也可以直接传入一个字符串,如combobox.current("选项 2"),如果该字符串存在于values中,就会被选中。
获取 Combobox 的值
获取用户当前选择的值或输入的值是 Combobox 最常见的操作之一,我们使用 get() 方法。
import tkinter as tk
from tkinter import ttk
def show_selection():
# 获取 Combobox 的当前值
selected_value = combobox.get()
print(f"你选择了: {selected_value}")
# 也可以更新标签的文本
label.config(text=f"当前选择: {selected_value}")
root = tk.Tk()"获取 Combobox 的值")
root.geometry("300x150")
# 创建 Combobox
combobox = ttk.Combobox(root, values=["苹果", "香蕉", "橙子", "葡萄"])
combobox.pack(pady=10)
combobox.current(0) # 默认选中 "苹果"
# 创建一个按钮,点击时获取值
button = ttk.Button(root, text="获取选择", command=show_selection)
button.pack(pady=5)
# 创建一个标签,用于显示选择结果
label = ttk.Label(root, text="请做出选择")
label.pack(pady=5)
root.mainloop()
代码解释:

combobox.get(): 这个方法会返回 Combobox 当前显示的字符串,这可能是用户从列表中选择的,也可能是用户直接输入的。- 我们定义了一个
show_selection函数,并将其绑定到按钮的command上,当按钮被点击时,函数会获取Combobox的值并打印或显示在Label上。
绑定事件
除了通过按钮触发,我们还可以在用户与 Combobox 交互时自动执行操作,例如当用户选择一个新选项时。
Combobox 常用的事件有:
<<ComboboxSelected>>: 当用户从下拉列表中选择一个新选项时触发。注意: 如果用户只是输入文本而没有从列表中选择,这个事件不会触发。<KeyRelease>: 当用户在 Combobox 中松开任意键时触发。
import tkinter as tk
from tkinter import ttk
def on_select(event):
# 这个函数会在用户从下拉列表中选择一个选项时被自动调用
selected_value = combobox.get()
print(f"下拉列表选择事件: {selected_value}")
def on_key_release(event):
# 这个函数会在用户输入时被调用
current_text = combobox.get()
print(f"按键释放事件: 当前输入 '{current_text}'")
root = tk.Tk()"Combobox 事件绑定")
root.geometry("300x150")
combobox = ttk.Combobox(root, values=["北京", "上海", "广州", "深圳"])
combobox.pack(pady=20, padx=20)
combobox.current(0)
# 绑定事件
combobox.bind('<<ComboboxSelected>>', on_select)
combobox.bind('<KeyRelease>', on_key_release)
root.mainloop()
高级用法
1 禁止用户输入
如果你只想让用户从列表中选择,而不允许他们自由输入,可以将 state 属性设置为 "readonly"。
# state="readonly" 表示用户只能选择,不能编辑 readonly_combobox = ttk.Combobox(root, values=["只读选项A", "只读选项B"], state="readonly") readonly_combobox.pack(pady=10)
2 状态设置
state 属性有三个主要值:
"normal"(默认): 用户可以输入和选择。"readonly": 用户只能选择,不能修改文本框中的内容。"disabled": 控件完全被禁用,呈灰色,无法交互。
# 禁用 Combobox disabled_combobox = ttk.Combobox(root, values=["禁用选项"], state="disabled") disabled_combobox.pack(pady=10)
3 动态更新列表
你可以通过修改 values 属性来动态更新 Combobox 的选项列表。
import tkinter as tk
from tkinter import ttk
def update_list():
# 获取输入框的新选项
new_option = entry.get()
if new_option: # 确保输入不为空
# 获取当前列表
current_values = list(combobox['values'])
# 如果新选项不在列表中,则添加
if new_option not in current_values:
current_values.append(new_option)
# 更新 Combobox 的列表
combobox['values'] = current_values
# 清空输入框
entry.delete(0, tk.END)
root = tk.Tk()"动态更新 Combobox 列表")
root.geometry("300x200")
# 初始 Combobox
combobox = ttk.Combobox(root, values=["初始选项1", "初始选项2"])
combobox.pack(pady=10, padx=20, fill='x') # fill='x' 让它水平填充
# 用于输入新选项的 Entry
label = ttk.Label(root, text="输入新选项:")
label.pack()
entry = ttk.Entry(root)
entry.pack(pady=5, padx=20, fill='x')
# 用于更新列表的按钮
update_button = ttk.Button(root, text="添加到列表", command=update_list)
update_button.pack(pady=10)
root.mainloop()
4 自动补全功能
ttk.Combobox 本身不提供像网页搜索框那样的智能自动补全,但我们可以利用 validate 和 validatecommand 来实现一个简单的版本。
import tkinter as tk
from tkinter import ttk
def on_validate(P):
"""
验证函数,当输入框内容改变时被调用
P: 预期的新文本内容
"""
# 获取当前输入框的全部内容
current_text = combobox.get()
# 检查新内容是否存在于我们的列表中
if P in all_fruits or P == "":
return True # 允许更新
else:
# 如果输入不匹配任何选项,则阻止更新(可选)
# 这里我们允许输入,但高亮提示
combobox.delete(0, tk.END)
combobox.insert(0, current_text)
return False
# 所有可选项
all_fruits = ["Apple", "Banana", "Cherry", "Date", "Elderberry"]
root = tk.Tk()"Combobox 自动补全示例")
root.geometry("300x150")
combobox = ttk.Combobox(root, values=all_fruits, validate="key")
combobox.pack(pady=20, padx=20, fill='x')
# 注册验证命令
# %P 是一个占位符,代表验证后的新文本
vcmd = (root.register(on_validate), '%P')
combobox.configure(validatecommand=vcmd)
root.mainloop()
注意: 上面的自动补全示例比较简单,一个更健壮的实现会检查 P 是否是某个选项的前缀,并自动补全剩余部分,但这需要更复杂的逻辑。
| 功能/属性 | 方法/说明 | 示例 |
|---|---|---|
| 创建 | ttk.Combobox(parent, values=...) |
cb = ttk.Combobox(root, values=["A", "B"]) |
| 设置默认值 | current(index) |
cb.current(0) (选第一个) 或 cb.current("A") |
| 获取值 | get() |
value = cb.get() |
| 绑定事件 | bind('<<ComboboxSelected>>', func) |
cb.bind('<<ComboboxSelected>>', my_function) |
| 禁止输入 | state="readonly" |
cb = ttk.Combobox(..., state="readonly") |
| 禁用控件 | state="disabled" |
cb = ttk.Combobox(..., state="disabled") |
| 更新列表 | 修改 ['values'] 属性 |
cb['values'] = ("新", "列", "表") |
Combobox 是一个非常实用的控件,掌握它的基本用法和一些高级技巧,能让你构建出更友好、更专业的 GUI 应用程序。
