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

Python Tkinter如何获取所有动态Entry输入框内容插入SQLite3同一行

问题原因

  • 你当前代码的save()方法仅读取了self.ent1、self.ent2、self.ent3三个实例属性,这三个属性每次调用addBox()新增输入框时都会被覆盖,始终指向最后一次新增的三个输入框,所以插入数据库时只能拿到最后三个值。
  • 要将所有输入框内容存入同一行,需要先遍历存储了所有输入框的self.all_entries列表,收集全所有输入值后再执行插入操作。

修复方案

这里提供两种适配不同需求的实现方式:

方案1:序列化存储(无需修改表结构,适配任意数量输入框)

将所有输入框的内容序列化为JSON字符串存入单字段,灵活适配点击任意次添加按钮的场景,修改后的完整代码如下:

import sqlite3
import json
from tkinter import *

class sample:
    def __init__(self, root):
        self.root = root
        self.all_entries = []

        showButton = Button(root, text='Show all text', command=self.showEntries)
        showButton.pack()

        addboxButton = Button(root, text='<Add Time Input>', fg="Red", command=self.addBox)
        addboxButton.pack()

        savee = Button(root, text='Save', fg="green", command=self.save)
        savee.pack()

    def save(self):
        # 收集所有输入框的值
        all_values = []
        for ent1, ent2, ent3 in self.all_entries:
            all_values.append([ent1.get(), ent2.get(), ent3.get()])
        # 序列化为JSON字符串
        values_str = json.dumps(all_values, ensure_ascii=False)

        con = sqlite3.connect(database=r'data.db')
        cur = con.cursor()
        # 此处可根据实际表结构调整字段,示例是将所有值存入content字段,可搭配其他业务字段使用
        cur.execute("Insert into e_transations (content) values(?)", (values_str,))
        con.commit()
        con.close()

    def addBox(self):
        frame = Frame(root)
        frame.pack()

        Label(frame, text='From').grid(row=0, column=0)
        ent1 = Entry(frame)
        ent1.grid(row=1, column=0)

        Label(frame, text='To').grid(row=0, column=1)
        ent2 = Entry(frame)
        ent2.grid(row=1, column=1)

        ent3 = Entry(frame)
        ent3.grid(row=1, column=2)

        self.all_entries.append((ent1, ent2, ent3))

    def showEntries(self):
        for number, (ent1, ent2, ent3) in enumerate(self.all_entries):
            print(number, ent1.get(), ent2.get(), ent3.get())

root = Tk()
obj = sample(root)
root.mainloop()

方案2:多字段拼接存储(适配固定字段数的表结构)

如果你的e_transations表提前创建了对应数量的字段,比如最多支持5组输入对应15个字段,可以直接拼接所有值为插入参数,仅需修改save方法即可:

def save(self):
    # 按顺序收集所有输入框的值
    params = []
    for ent1, ent2, ent3 in self.all_entries:
        params.extend([ent1.get(), ent2.get(), ent3.get()])
    # 自动生成对应数量的占位符
    placeholders = ','.join(['?'] * len(params))

    con = sqlite3.connect(database=r'data.db')
    cur = con.cursor()
    # 字段列表要和实际表的字段顺序、数量完全对应
    cur.execute(f"Insert into e_transations (字段1,字段2,字段3,...字段N) values({placeholders})", params)
    con.commit()
    con.close()

注意事项

  • 如果采用方案2,需要保证表字段的数量和你最多要添加的输入框总数一致
  • 原代码中addBox方法里不需要把输入框赋值给self.ent1等实例属性,直接存到all_entries列表即可,避免变量覆盖

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:39:01