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

CustomTkinter遍历CSV创建按钮时文本均为最后一项如何修复

问题根因

代码使用了两层错误的嵌套循环:

  • 外层每遍历1个Number of studs列的数值,内层就会遍历完整的Name列所有17个值
  • 同一个网格位置会被重复创建17次按钮,最后一次创建的按钮文本固定是Name列的最后一个值Q,会覆盖同位置之前创建的所有按钮,最终视觉上所有按钮都显示Q
  • 额外问题:直接用Number of studs的值(从1开始计数)做divmod计算行列索引,会导致第一行的布局位置偏移,不符合grid布局从0开始计数的常规逻辑。
修复代码

删除内层多余的循环,改为逐行同步读取两列的匹配值创建按钮即可,两种实现方式二选一:

方式1:按行遍历DataFrame

def widget_creator():
    # 逐行遍历,每次取同一行的两个字段值
    for row_idx, row in df.iterrows():
        btn_text = row['Name']
        # 用从0开始的行索引计算3列布局的行列位置
        grid_r, grid_c = divmod(row_idx, 3)
        ct.CTkButton(
            new_frame,
            text=btn_text,
            text_font=('Montserrat', 15, 'bold'),
            corner_radius=10,
            fg_color=random.choice(colors),
            text_color='#FFFFFF'
        ).grid(
            row=grid_r,
            column=grid_c,
            pady=100,
            padx=50,
            ipadx=100,
            ipady=130
        )

方式2:用zip同步遍历两列

def widget_creator():
    # 打包两列数据同步遍历,用enumerate生成从0开始的索引算布局
    for idx, (stud_count, btn_text) in enumerate(zip(df['Number of studs'], df['Name'])):
        grid_r, grid_c = divmod(idx, 3)
        ct.CTkButton(
            new_frame,
            text=btn_text,
            text_font=('Montserrat', 15, 'bold'),
            corner_radius=10,
            fg_color=random.choice(colors),
            text_color='#FFFFFF'
        ).grid(
            row=grid_r,
            column=grid_c,
            pady=100,
            padx=50,
            ipadx=100,
            ipady=130
        )
注意事项
  • 不要在遍历pandas列的时候写无意义的嵌套循环,需要匹配同一行的多列值时,优先用逐行遍历或者zip打包列的方式取值
  • 原代码中pady、padx、ipadx参数数值偏大,运行后如果觉得按钮间距过疏、尺寸异常,可以根据实际窗口大小调整数值。

内容的提问来源于stack exchange,提问作者Alt_2003

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:30:42