Tkinter同一Combobox如何同时保存选中名称及对应ID到数据库
核心问题
你调用insert方法时,最后一个id_campionato参数传入的是联赛名称(campionato.get()),没有调用已编写的id_campionati查询函数获取对应ID,导致存储值错误。
修改步骤
- 调整
id_campionati函数的返回逻辑,避免无匹配结果时报索引错误:
def id_campionati(): campionato_name = combo_Campionato.get() cursor.execute('SELECT ID_Campionato FROM ARCHIVIO_Campionati WHERE Nome_Campionato=?',(campionato_name,)) result = [row[0] for row in cursor] # 有匹配结果返回第一个ID,无结果返回None return result[0] if result else None
- 修改
add_employee函数中调用db.insert的参数,将最后一位替换为id_campionati()的返回值:
def add_employee(): if combo_Campionato.get() == "" or combo_Giornate.get() == "" or de.get() == "" or combo_Orario_Ora.get() == "" or combo_Orario_Minuti.get() == "" or combo_NomeSquadra_Casa.get() == "" or combo_NomeSquadra_Fuori.get() == "" or combo_Risultato_Sq_A.get() == "" or combo_Risultato_Sq_B.get() == "": messagebox.showerror("Erorr in Input", "Please Fill All the Details") return # 仅修改最后一个参数即可 db.insert( campionato.get(), giornata.get(), de.get(), combo_Orario_Ora.get(), combo_Orario_Minuti.get(), combo_NomeSquadra_Casa.get(), combo_NomeSquadra_Fuori.get(), combo_Risultato_Sq_A.get(), combo_Risultato_Sq_B.get(), id_campionati() ) messagebox.showinfo("Success", "Record Inserted") clearAll() dispalyAll()
可选优化方案
如果想要减少数据库查询次数,可以在初始化Combobox时就生成联赛名称与ID的映射字典,后续插入数据时直接从字典取ID即可:
# 全局存储名称-ID映射 campionato_id_map = {} def combo_campionati(): # 同时查询名称和ID cursor.execute('SELECT Nome_Campionato, ID_Campionato FROM ARCHIVIO_CAMPIONATI') name_list = [] for name, cid in cursor: name_list.append(name) campionato_id_map[name] = cid return name_list
插入数据时直接取对应ID即可,无需每次查询数据库:
db.insert( # 其他参数保持不变 campionato_id_map.get(campionato.get()) )
内容的提问来源于stack exchange,提问作者William50694
相关产品推荐
相关产品推荐

