You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 18:27:01