Tkinter Combobox与SQLite3数据库交互异常问题求助
问题解决与代码修正
问题根源
- 重复插入问题:
add_to_database()函数中每次都将i初始化为0,导致始终插入caster_data[0](列表第一个元素),而非新输入的值。 - 连接对象错误覆盖:初始化时
con_sec = con_sec.cursor()把数据库连接对象替换成了游标对象,会引发后续数据库操作异常。 - 数据不同步:添加数据后直接用本地列表更新Combobox,未从数据库重新拉取数据,导致重启后数据出现异常。
修正后的初始化代码
import sqlite3 import tkinter as tk from tkinter import ttk # 初始化Tkinter窗口与Combobox root = tk.Tk() combo = ttk.Combobox(root) combo.pack() # 数据库连接与游标初始化 con_caster = sqlite3.connect('caster.db') con_sec = sqlite3.connect('section.db') cur_caster = con_caster.cursor() cur_sec = con_sec.cursor() # 修正:创建section表的游标,不覆盖连接对象 # 创建caster表(字段名无需加单引号) cur_caster.execute("CREATE TABLE IF NOT EXISTS caster (casterid TEXT, casterradius NUMBER);") # 从数据库读取casterid并更新Combobox cur_caster.execute('SELECT casterid FROM caster') caster_data = [row[0] for row in cur_caster.fetchall()] combo['values'] = caster_data
修正后的添加数据函数
def add_to_database(): # 获取输入框内容(假设add_cid是输入casterid的Entry组件) new_caster_id = add_cid.get().strip() # 若有单独的radius输入框,替换为对应的组件取值,如add_radius.get().strip() new_radius = add_cid.get().strip() # 空值不插入 if not new_caster_id: return # 插入新数据到数据库 cur_caster.execute("INSERT INTO caster (casterid, casterradius) VALUES (?, ?);", (new_caster_id, new_radius)) con_caster.commit() # 从数据库重新读取所有casterid,确保Combobox与数据库完全同步 cur_caster.execute('SELECT casterid FROM caster') updated_data = [row[0] for row in cur_caster.fetchall()] combo['values'] = updated_data # 清空输入框 add_cid.delete(0, tk.END)
修正效果
- 添加数据时,输入的新值会被正确插入数据库,Combobox不会出现重复值。
- 重启应用后,会从数据库读取完整的正确数据,不会出现元素被替代的异常。
- 修复了数据库连接对象被覆盖的潜在错误。
内容的提问来源于stack exchange,提问作者Prashant Priyadarshi
相关产品推荐
相关产品推荐

