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

Tkinter用for循环生成的Entry数据存入Excel仅保存最后值如何解决

问题原因分析
  • 核心错误1:save_data函数的for循环内部每次迭代都将行号fila重置为1,导致所有Entry的内容都被写入Excel第1行,后写入的内容直接覆盖前面的内容,最终只会保留最后一个Entry的值
  • 核心错误2:Excel保存操作book.save()被放在for循环内部,每次写入一行就执行一次保存,既冗余也容易引发IO异常
  • 额外小问题:原始代码中的"是HTML转义字符,实际运行时要替换为正常的双引号,未使用的导入包可以清理减少运行负担
修复方案

直接修改save_data函数即可,操作如下:

  1. 将行号初始化代码fila = 1移到for循环外部,保证每次循环行号正常累加
  2. 将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:18:03