- 让用户从一组选项中选择一个或多个项目:这通常通过
Listbox(列表框)、Radiobutton(单选按钮) 和Checkbutton(复选框) 来实现。 - 让用户从文件系统中选择文件或目录:这通过
filedialog模块来实现。
下面我将分模块、分场景地为你介绍和提供代码示例。

从一组选项中选择
Listbox (列表框)
Listbox 用于显示一个文本列表,用户可以从中选择一个或多个项目。
核心功能:
- 单选:默认行为,点击一个项目,另一个被选中的项目会自动取消。
- 多选:按住
Ctrl或Shift键可以多选。 - 获取选中项:使用
curselection()方法,它返回选中项的索引(从 0 开始)。
示例代码:
import tkinter as tk
from tkinter import ttk
def show_selection():
# 获取选中项的索引
selected_indices = listbox.curselection()
if not selected_indices:
result_label.config(text="请选择一个或多个水果!")
return
# 根据索引获取对应的值
selected_items = [listbox.get(i) for i in selected_indices]
result_label.config(text=f"你选择了: {', '.join(selected_items)}")
# 创建主窗口
root = tk.Tk()"Tkinter Listbox 示例")
root.geometry("300x250")
# 创建一个 Listbox
listbox = tk.Listbox(root, selectmode=tk.MULTIPLE, height=6) # selectmode=tk.SINGLE 为单选
listbox.pack(pady=10, padx=20, fill='both', expand=True)
# 添加选项
fruits = ["苹果", "香蕉", "橙子", "葡萄", "西瓜"]
for fruit in fruits:
listbox.insert(tk.END, fruit)
# 创建一个按钮来触发选择事件
show_button = ttk.Button(root, text="显示选择", command=show_selection)
show_button.pack(pady=5)
# 创建一个标签来显示结果
result_label = ttk.Label(root, text="等待选择...")
result_label.pack(pady=5)
root.mainloop()
Radiobutton (单选按钮)
Radiobutton 用于在一组互斥的选项中,让用户只能选择一个,它们通常需要共享一个 variable (变量),这个变量的值代表了当前被选中的按钮的值。

核心功能:
- 互斥性:一组
Radiobutton共享一个tk.StringVar,选择任何一个都会改变这个变量的值。 - 获取选中项:直接读取共享的
variable的值。
示例代码:
import tkinter as tk
from tkinter import ttk
def show_gender_selection():
# gender_var.get() 会返回当前选中的按钮的 value
selected_gender = gender_var.get()
result_label.config(text=f"你的性别是: {selected_gender}")
# 创建主窗口
root = tk.Tk()"Tkinter Radiobutton 示例")
root.geometry("300x200")
# 创建一个 StringVar 来跟踪选中的值
gender_var = tk.StringVar(value="未知") # 设置默认值
# 创建 Radiobutton
# text 是显示的文本,value 是与该按钮关联的值,variable 是共享的变量
male_radio = ttk.Radiobutton(root, text="男", value="男", variable=gender_var)
male_radio.pack(pady=5)
female_radio = ttk.Radiobutton(root, text="女", value="女", variable=gender_var)
female_radio.pack(pady=5)
other_radio = ttk.Radiobutton(root, text="其他", value="其他", variable=gender_var)
other_radio.pack(pady=5)
# 创建一个按钮来触发选择事件
show_button = ttk.Button(root, text="确认选择", command=show_gender_selection)
show_button.pack(pady=10)
# 创建一个标签来显示结果
result_label = ttk.Label(root, text="请选择你的性别")
result_label.pack(pady=5)
root.mainloop()
Checkbutton (复选框)
Checkbutton 用于让用户在一组选项中进行多选,每个 Checkbutton 都有自己的 variable,通常是一个 tk.IntVar 或 tk.BooleanVar。
核心功能:

- 多选:每个选项独立,互不影响。
- 获取选中项:检查每个
variable的值(var.get() == 1表示被选中)。
示例代码:
import tkinter as tk
from tkinter import ttk
def show_hobbies_selection():
hobbies = []
# 检查每个 Checkbutton 的变量
if var_music.get() == 1:
hobbies.append("音乐")
if var_sport.get() == 1:
hobbies.append("运动")
if var_reading.get() == 1:
hobbies.append("阅读")
if hobbies:
result_label.config(text=f"你的爱好是: {', '.join(hobbies)}")
else:
result_label.config(text="你没有选择任何爱好")
# 创建主窗口
root = tk.Tk()"Tkinter Checkbutton 示例")
root.geometry("300x200")
# 为每个 Checkbutton 创建一个 IntVar
var_music = tk.IntVar()
var_sport = tk.IntVar()
var_reading = tk.IntVar()
# 创建 Checkbutton
# text 是显示的文本,variable 是关联的变量
check_music = ttk.Checkbutton(root, text="音乐", variable=var_music)
check_music.pack(anchor='w', padx=20, pady=5)
check_sport = ttk.Checkbutton(root, text="运动", variable=var_sport)
check_sport.pack(anchor='w', padx=20, pady=5)
check_reading = ttk.Checkbutton(root, text="阅读", variable=var_reading)
check_reading.pack(anchor='w', padx=20, pady=5)
# 创建一个按钮来触发选择事件
show_button = ttk.Button(root, text="确认选择", command=show_hobbies_selection)
show_button.pack(pady=10)
# 创建一个标签来显示结果
result_label = ttk.Label(root, text="请选择你的爱好")
result_label.pack(pady=5)
root.mainloop()
从文件系统选择
当需要让用户选择文件或保存文件时,我们使用 tkinter.filedialog 模块,它不创建任何新的控件,而是弹出系统原生的文件选择对话框。
选择单个文件 (askopenfilename)
示例代码:
import tkinter as tk
from tkinter import filedialog, ttk
def select_file():
# filedialog.askopenfilename() 会打开一个文件选择对话框
# 返回用户选择的文件的完整路径
file_path = filedialog.askopenfilename(
title="选择一个文件",
filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")]
)
if file_path: # 如果用户没有取消选择
file_label.config(text=f"已选择文件: {file_path}")
else:
file_label.config(text="未选择任何文件")
# 创建主窗口
root = tk.Tk()"文件选择对话框示例")
root.geometry("400x150")
select_button = ttk.Button(root, text="选择文件", command=select_file)
select_button.pack(pady=20)
file_label = ttk.Label(root, text="点击按钮选择一个文件", wraplength=350)
file_label.pack(pady=10)
root.mainloop()
选择多个文件 (askopenfilenames)
这个函数返回一个元组,包含所有被选中的文件的路径。
# ... (其他代码与上面类似)
def select_multiple_files():
file_paths = filedialog.askopenfilenames(
title="选择多个文件",
filetypes=[("图片文件", "*.png;*.jpg"), ("所有文件", "*.*")]
)
if file_paths:
file_label.config(text=f"已选择 {len(file_paths)} 个文件:\n{', '.join(file_paths)}")
else:
file_label.config(text="未选择任何文件")
# ... (在 root 中创建一个按钮,并绑定 command=select_multiple_files)
选择目录 (askdirectory)
用于选择一个文件夹。
# ... (其他代码与上面类似)
def select_directory():
dir_path = filedialog.askdirectory(title="选择一个目录")
if dir_path:
dir_label.config(text=f"已选择目录: {dir_path}")
else:
dir_label.config(text="未选择任何目录")
# ... (在 root 中创建一个按钮,并绑定 command=select_directory)
保存文件 (asksaveasfilename)
用于让用户指定一个文件名来保存文件。
# ... (其他代码与上面类似)
def save_file():
file_path = filedialog.asksaveasfilename(
title="保存文件",
defaultextension=".txt", # 默认扩展名
filetypes=[("文本文件", "*.txt"), ("Python 文件", "*.py"), ("所有文件", "*.*")]
)
if file_path:
# 在这里可以写入文件内容
# with open(file_path, 'w', encoding='utf-8') as f:
# f.write("这是要保存的内容")
save_label.config(text=f"文件将保存为: {file_path}")
else:
save_label.config(text="保存操作已取消")
# ... (在 root 中创建一个按钮,并绑定 command=save_file)
总结与选择建议
| 控件/模块 | 用途 | 选择方式 | 获取选中值的方法 |
|---|---|---|---|
Listbox |
从一个列表中选择一个或多个项目 | 点击,支持 Ctrl/Shift 多选 |
listbox.curselection() (获取索引) |
Radiobutton |
从一组互斥选项中选择一个 | 点击 | variable.get() (获取关联的 value) |
Checkbutton |
从一组独立选项中选择零个或多个 | 勾选/取消勾选 | variable.get() == 1 (检查每个关联的 IntVar) |
filedialog |
从文件系统选择文件或目录 | 弹出系统原生对话框 | 函数直接返回路径字符串 |
如何选择?
- 选择列表项:
- 如果选项很多,或者需要滚动,用
Listbox。 - 如果是简单的“是/否”或“A/B/C”选择,用
Radiobutton或Checkbutton更直观。
- 如果选项很多,或者需要滚动,用
- 选择文件/目录:
- 直接使用
filedialog模块中的函数,这是唯一且标准的方法。
- 直接使用
希望这个详细的解释和示例能帮助你理解和使用 Tkinter 中的各种“选择”功能!
