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

