Python实现SQLite数据库记录删除方法咨询及Tkinter GUI应用删除功能失效问题求助
解决Python SQLite GUI应用中删除记录失效的问题
我帮你排查出了删除功能失效的几个核心原因,咱们一步步修复:
问题分析
你的删除功能没反应主要是这几个点:
- 未提交数据库事务:SQLite执行
DELETE这类修改操作后,必须调用conn.commit()才能把更改写入数据库,你的代码漏掉了这一步 - GUI列表未刷新:就算删除成功,界面上的记录列表也不会自动更新,你看不到变化
- 缺少操作反馈:不管删除成功/失败,你都没有收到提示,无法确认操作结果
- 未处理空输入:如果没输入标题就点删除,程序啥反应都没有
修复后的完整代码
我修改了关键函数,添加了必要的逻辑,你可以直接替换原有代码:
#IMPORTAZIONE MODULI from cProfile import label from cgitb import text from tkinter import * import sqlite3 from tkinter import messagebox from tkinter.ttk import Labelframe from turtle import width from numpy import delete from pandas import wide_to_long #CREAZIONE DATABASE conn=sqlite3.connect('MangaManager.db') #creazione del cursone c=conn.cursor() #CREAZIONE TABELLA '''c.execute("""CREATE TABLE Record( Titolo text, Tipo text, Valutazione int )""")''' #SEZIONE DEFINIZIONI FUNZIONI #FUNZIONE INSERT def insert(): conn=sqlite3.connect('MangaManager.db') c=conn.cursor() if Entrate[0].get()!="" and Entrate[1].get()!="" and Entrate[2].get()!="": c.execute("""INSERT INTO Record(Titolo, Tipo, Valutazione) VALUES (:Titolo, :Tipo, :Valutazione)""", { 'Titolo':Entrate[0].get(), 'Tipo':Entrate[1].get(), 'Valutazione':Entrate[2].get() }) # 插入后刷新列表 aggiorna_lista() messagebox.showinfo("Successo", "Record inserito correttamente!") else: messagebox.showerror("Errore inserimento", "Non hai compilato uno dei campi, non è permesso lasciarne vuoti") conn.commit() conn.close() Entrate[0].delete(0, END) Entrate[1].delete(0, END) Entrate[2].delete(0, END) #FUNZIONE RECUPERA REPORT def RecuperaReport(): conn=sqlite3.connect('MangaManager.db') #creazione del cursone c=conn.cursor() c.execute('''SELECT *, oid FROM record''') reports=c.fetchall() lista=[] for record in reports: lista.append(record[0]+' '+record[1]+' '+str(record[2])) conn.close() # 查询操作无需提交事务,移除多余的commit return lista # FUNZIONE AGGIORNA LISTA INTERFACCIA def aggiorna_lista(): # 清空容器里的旧标签 for widget in Contenitore.winfo_children(): widget.destroy() # 加载最新记录 for l in RecuperaReport(): etichetta=Label(Contenitore, text=l) etichetta.pack(side=BOTTOM) #FUNZIONE DELETE def delete(): conn=sqlite3.connect('MangaManager.db') c=conn.cursor() titolo_da_cancellare = Entrate[3].get().strip() # 检查输入是否为空 if not titolo_da_cancellare: messagebox.showerror("Errore cancellazione", "Devi inserire un titolo da cancellare!") conn.close() return # 先检查记录是否存在 c.execute('SELECT * FROM record WHERE Titolo = :titolo', {'titolo': titolo_da_cancellare}) record_trovato = c.fetchone() if not record_trovato: messagebox.showwarning("Attenzione", "Nessun record trovato con questo titolo!") conn.close() return # 执行删除 c.execute('DELETE FROM record WHERE Titolo = :titolo', {'titolo': titolo_da_cancellare}) conn.commit() conn.close() # 清空输入框 Entrate[3].delete(0, END) # 刷新界面列表 aggiorna_lista() messagebox.showinfo("Successo", "Record cancellato correttamente!") #SEZIONE CREAZIONE INTEFRACCIA GRAFICA #CREAZIONE FINESTRA f=Tk() f.title("MyMangAndAnimeManager") f.geometry("560x560") #CREAZIONE TITOLO titolo=Label(f, text="MyMangAndAnimeManager") titolo.grid(row=0 ,column=0,columnspan=3, sticky=E+W) #CREAZIONE BLOCCHI ENTRATA Entrate=[] for i in range(0, 3): entry=Entry(f, width=27) entry.grid(column=i, row=1, padx=(10, 0)) Entrate.append(entry) #CREAZIONE ENTRY PER LA CANCELLAZIONE EtichettaCanc=Label(f, text="Inserire il titolo da cancellare", width=27) EtichettaCanc.grid(row=5, column=0, columnspan=3, pady=(10,0)) entry=Entry(f, width=27) Entrate.append(entry) Entrate[3].grid(row=6, column=0, columnspan=3, pady=(10,0)) BottoneCanc=Button(f, text="Premere per cancellare", command=delete, width=27) BottoneCanc.grid(row=8, column=0, columnspan=3, pady=(10,0)) #CREAZIONE CONTENITORE LISTA ANIME Contenitore=Labelframe(f, width=50, height=200) Contenitore.grid(row=4 ,column=0, pady=(10,0), columnspan=3, sticky=W, padx=(10,0)) # 初始化调用刷新函数 aggiorna_lista() #CREAZIONE BOTTONE ENTRATA DATI B=Button(f, text="Premere per inserire", command=insert, width=27) B.grid(row=3 ,column=1, pady=10) #FINE DEL LOOP f.mainloop()
关键修改点说明
- 添加事务提交:在delete函数里加入
conn.commit(),确保删除操作真正写入数据库 - 新增界面刷新函数:
aggiorna_lista()负责清空旧记录并加载最新数据,插入和删除后都调用它,保证界面与数据库状态同步 - 完善输入验证:检查删除输入是否为空,以及对应记录是否存在,给你明确的提示信息
- 优化查询操作:RecuperaReport函数里去掉了不必要的
conn.commit()(查询操作不需要提交事务) - 添加操作反馈:用
messagebox给出成功/失败提示,让你清楚操作结果
现在你运行修改后的代码,点击删除按钮后就能正常删除记录,界面也会实时更新啦!
内容的提问来源于stack exchange,提问作者Marco Prandoni




