如何用Python的Tkinter为CSV文件中每条条目创建单选按钮?
Tkinter从CSV动态生成角色种族单选按钮方案
要实现无需修改代码即可增删种族选项,核心思路是从CSV读取数据循环生成单选按钮,用tkinter.StringVar统一管理选中状态。下面是具体实现:
1. 准备种族CSV文件
创建races.csv文件,每行存储种族名称和对应ID(后续要扩展字段直接添加即可):
种族名称,种族ID Human,1 Tagüel,2 Manakete,3 ```选择客户端就选这个种族名称 rm�修改�子, Manakete,3 Half-Tagüel,4 Half-Manakete,5 Half-Tagüel-Manakete,6
2. 修改原函数为动态生成单选按钮
替换硬编码的按钮逻辑,改为读取CSV动态创建单选按钮:
import tkinter import csv def Enemy_Race_Select(type): windowRace = tkinter.Tk() windowRace.title("FE TTRPG Tools - Enemy Stats Calculators - Race Select") windowRace.geometry('600x400') # 返回按钮 buttonBackStatsR = tkinter.Button(windowRace, text='Go Back', command=windowRace.destroy) buttonBackStatsR.pack() # 标题 labelInRace = tkinter.Label(windowRace, text="Choose your race") labelInRace.pack() # 存储选中的种族ID selected_race_id = tkinter.StringVar() # 读取CSV并生成单选按钮 try: with open('races.csv', 'r', encoding='utf-8') as file: reader = csv.DictReader(file) for row in reader: race_name = row['种族名称'] race_id = row['种族ID'] # 创建单选按钮 radio_btn = tkinter.Radiobutton( windowRace, text=race_name, variable=selected_race_id, value=race_id ) radio_btn.pack(pady=5) except FileNotFoundError: # 处理CSV文件不存在的异常 error_label = tkinter.Label(windowRace, text="错误:未找到races.csv文件", fg='red') error_label.pack() # 确认选择按钮逻辑 def confirm_race(): race_id = selected_race_id.get() if race_id: Enemy_Class_Select(type, int(race_id)) windowRace.destroy() else: # 提示未选择种族 warn_label = tkinter.Label(windowRace, text="先选个种族再确认!", fg='orange') warn_label.pack() buttonConfirm = tkinter.Button(windowRace, text="确认选择", command=confirm_race) buttonConfirm.pack(pady=10) # 保留原自定义种族相关按钮 buttonCustomRace = tkinter.Button(windowRace, text="Custom class") buttonCustomRace.pack() buttonCreateRace = tkinter.Button(windowRace, text="Create a custom class", command=lambda: Race_creation()) buttonCreateRace.pack() windowRace.mainloop() # 假设以下函数已实现 def Enemy_Class_Select(enemy_type, race_id): print(f"选择了种族ID:{race_id},敌人类型:{enemy_type}") def Race_creation(): print("打开自定义种族创建界面")
关键说明
- CSV灵活扩展:用
csv.DictReader取得字段当前熟悉查联版本T indexedo会GUstr统一管理,以后要加种族特性、初始属性这类字段,直接修改CSV即可,无需改动代码。 - 单选按钮状态统一:所有单选按钮绑定同一个
StringVar,通过selected_race_id.get()就能直接获取选中的种族ID,不用逐个判断按钮状态。 - 容错处理:添加了CSV文件不存在的异常提示,避免程序直接崩溃。
- 界面优化:给单选按钮添加间距,用单独的确认按钮处理选择逻辑,比原硬编码按钮的界面更整洁。
内容的提问来源于stack exchange,提问作者5BNeumann
相关产品推荐
相关产品推荐

