Python(tkinter)循环生成的Checkbutton如何获取选中状态并导出CSV?
解决方法
你可以通过二维变量存储结构绑定每个Checkbutton的选中状态,实现精准识别,具体实现逻辑和修改后代码如下:
核心实现思路
- 提前创建一个二维的
BooleanVar列表,第一维对应员工,第二维对应时段,每个BooleanVar专门用来存储对应位置Checkbutton的选中状态 - 生成Checkbutton时通过
variable参数绑定对应的BooleanVar,同时可新增选中计数逻辑,满足每个员工最多勾选2个时段的需求 - 导出时直接遍历这个二维列表,即可快速获取所有选中的排班组合
完整修改代码
from tkinter import Tk, Label, Checkbutton, ttk, BooleanVar import csv # 提前定义好的业务变量示例: # times = ["14:00", "15:00", "16:00", "17:00", "18:00", "19:00", "20:00", "21:00", "22:00", "23:00"] 所有时段列表 # employees = [[员工id, 员工姓名], ...] 员工信息列表 master = Tk() # 初始化二维状态存储:[员工索引][时段索引] = 对应Checkbutton的选中状态 check_status = [] # 记录每个员工已选时段数量,用于限制最多选2个 selected_count = [0] * len(employees) emplindex = 1 timeindex = 1 # 生成顶部时段表头 for t in times: Label(master, text=f" {t} ").grid(row=0, column=timeindex) timeindex +=1 # 逐行生成每个员工的勾选区域 for empl_idx, empl in enumerate(employees): check_status.append([]) Label(master, text=empl[1]).grid(row=emplindex, column=0) timeindex = 1 for time_idx, t in enumerate(times): # 初始化当前位置的状态变量 var = BooleanVar(value=False) check_status[empl_idx].append(var) # 勾选校验逻辑,限制单个员工最多选2个时段 def on_check(e_idx=empl_idx, v=var): if v.get(): if selected_count[e_idx] >=2: # 已选满2个时自动取消本次勾选 v.set(False) else: selected_count[e_idx] +=1 else: selected_count[e_idx] -=1 # 绑定状态变量和校验逻辑,注意不要直接把grid写在控件创建语句末尾,grid返回值为None会丢失控件对象 cb = Checkbutton(master, variable=var, command=on_check) cb.grid(row=emplindex, column=timeindex) timeindex +=1 emplindex +=1 def buttonclicked(): # 收集所有选中的排班数据 schedule_data = [["员工姓名", "选中时段"]] for empl_idx, empl in enumerate(employees): for time_idx, t in enumerate(times): if check_status[empl_idx][time_idx].get(): schedule_data.append([empl[1], t]) # 导出为CSV文件 with open("排班表.csv", "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerows(schedule_data) buildbutton = ttk.Button(master, text = "生成排班表", command=buttonclicked) buildbutton.grid(row=100) master.mainloop()
内容的提问来源于stack exchange,提问作者Niek Wegman
相关产品推荐
相关产品推荐

