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
相关产品推荐
相关产品推荐

