You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python实现SQLite数据库记录删除方法咨询及Tkinter GUI应用删除功能失效问题求助

解决Python SQLite GUI应用中删除记录失效的问题

我帮你排查出了删除功能失效的几个核心原因,咱们一步步修复:

问题分析

你的删除功能没反应主要是这几个点:

  1. 未提交数据库事务:SQLite执行DELETE这类修改操作后,必须调用conn.commit()才能把更改写入数据库,你的代码漏掉了这一步
  2. GUI列表未刷新:就算删除成功,界面上的记录列表也不会自动更新,你看不到变化
  3. 缺少操作反馈:不管删除成功/失败,你都没有收到提示,无法确认操作结果
  4. 未处理空输入:如果没输入标题就点删除,程序啥反应都没有

修复后的完整代码

我修改了关键函数,添加了必要的逻辑,你可以直接替换原有代码:

#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

火山引擎 最新活动