Tkinter用for循环生成的Entry数据存入Excel仅保存最后值如何解决
问题原因分析
- 核心错误1:
save_data函数的for循环内部每次迭代都将行号fila重置为1,导致所有Entry的内容都被写入Excel第1行,后写入的内容直接覆盖前面的内容,最终只会保留最后一个Entry的值 - 核心错误2:Excel保存操作
book.save()被放在for循环内部,每次写入一行就执行一次保存,既冗余也容易引发IO异常 - 额外小问题:原始代码中的
"是HTML转义字符,实际运行时要替换为正常的双引号,未使用的导入包可以清理减少运行负担
修复方案
直接修改save_data函数即可,操作如下:
- 将行号初始化代码
fila = 1移到for循环外部,保证每次循环行号正常累加 - 将
book.save()操作移到for循环结束后,所有内容写入完成再统一保存
修正后的完整可运行代码
from tkinter import * from openpyxl import Workbook root = Tk() root.title("Entry Boxes") root.geometry("1150x600") book = Workbook() hoja = book.active my_entries = list() fila = 2 col_valor = 1 def save_data(): # 行号初始化移到循环外 fila = 1 for entries1 in my_entries: hoja.cell(row=fila, column=1, value=entries1.get()) fila += 1 print(entries1.get()) # 所有内容写完再统一保存 book.save('lista_CUIJ_ARCHIVO.xlsx') # 生成输入框 for y in range(4): for x in range(5): my_entry = Entry(root, width=12, font="Arial 13 bold") my_entry.focus() my_entry.grid(row=y, column=x, padx=55, pady=5, sticky='e', ipadx=2, ipady=2, columnspan=1) my_entries.append(my_entry) L = Label(root, width=5, text="21-0", font="Arial 12").grid(padx=5, pady=5, sticky='w', row=y, column=x) my_button = Button(root, text="Guardar", command=save_data, font="Arial 13 bold") my_button.grid(row=5, column=1, pady=20) root.mainloop()
扩展优化建议(可选)
- 如果需要按照输入框4行5列的布局对应写入Excel,可调整写入逻辑,将输入框的行列位置映射到Excel的行列,不用全部写入第一列
- 可添加保存成功的弹窗提示,提升使用体验
- 若需要重复点击保存不覆盖原有内容,可增加文件存在性判断,文件存在就加载现有内容追加写入,不存在再新建文件
内容的提问来源于stack exchange,提问作者Juan Bertone
相关产品推荐
相关产品推荐

