Python Tkinter GUI仅显示字典最后一条值无法输出所有未付费客户数据
核心问题定位
你当前代码只显示最后一条记录,本质是三类逻辑缺陷导致的:
- 存储结构缺陷:原
unpaidMembers字典为{客户名: 邮箱}的单值结构,既没有存储对应的欠缴月份信息,同个客户如果存在多笔欠缴时,新的键值会直接覆盖旧值,根本存不下全量数据 - 界面渲染缺陷:原代码仅创建了1行结果展示Label,无论循环拿到多少条数据,最终设置给StringVar的都是循环结束时留存的最后一次遍历的变量值,自然只会显示最后一条
- 变量名不匹配:循环内定义的是
cliente、mes,后续取值时用了未定义的client、month,本身存在运行时报错的隐患
落地修复方案
- 调整数据存储结构:把单键字典替换为存储全量欠缴记录的列表,每个列表元素保留客户名、邮箱、欠缴月份三个核心信息,避免数据覆盖
- 动态生成结果行:取消固定单行结果的StringVar绑定,遍历全量欠缴记录时逐行创建Label组件,按网格布局依次排列所有记录
- 统一变量命名,消除大小写不一致的报错
修复后可运行代码
from tkinter import * import openpyxl root = Tk() def func(): newWindow = Toplevel() newWindow.title("Output") newWindow.geometry("400x500+375+50") wb = openpyxl.load_workbook('C:/temp/cobranca.xlsx') sheet = wb['Sheet1'] lastCol = sheet.max_column # 存储全量欠缴记录,每个元素为(客户名, 邮箱, 欠缴月份) unpaid_records = [] for r in range(2, sheet.max_row + 1): for c in range(3, lastCol + 1): payment = sheet.cell(row=r, column=c).value # 跳过单元格空值的情况,避免误判 if payment and str(payment).strip().lower() != 'ok': cliente = sheet.cell(row=r, column=1).value email = sheet.cell(row=r, column=2).value mes = sheet.cell(row=1, column=c).value unpaid_records.append( (cliente, email, mes) ) print('Line:', r, 'Column:', c, 'Client:', cliente, 'Email:', email, 'Month:', mes) # 表头行 l_label1 = Label(newWindow, text="Client", font='-weight bold') l_label1.grid(row=1, column=1, padx=20, pady=5) l_label2 = Label(newWindow, text="Competence", font='-weight bold') l_label2.grid(row=1, column=2, padx=20, pady=5) # 动态遍历生成每一条欠缴记录的展示行 for idx, (cliente, email, mes) in enumerate(unpaid_records): row_pos = 2 + idx # 显示客户名 l_client = Label(newWindow, text=cliente) l_client.grid(row=row_pos, column=1, padx=20, pady=3) # 显示欠缴月份 l_month = Label(newWindow, text=mes) l_month.grid(row=row_pos, column=2, padx=20, pady=3) # 额外优化提示:如果欠缴记录数量超过窗口高度,可将结果区放入带滚动条的Canvas容器中,避免内容被窗口裁切 bt = Button(root, text='Check', command=func) bt.grid(row=1, column=1, padx=50, pady=20) root.mainloop()
效果说明
- 所有识别到的欠缴客户、对应欠缴月份都会按顺序在弹出的结果窗口中逐行排列,不会只显示最后一条
- 代码额外加了空值判断,不会把单元格本身为空的情况误判为未缴费
- 同个客户如果存在多个月份未缴费,会每一行展示一笔欠缴记录,不会出现数据覆盖的问题
内容的提问来源于stack exchange,提问作者Guvv
相关产品推荐
相关产品推荐

