You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter+SQLite删除数据时绑定数量不匹配错误求助

解决sqlite3删除数据时的绑定参数错误及Treeview更新问题

错误原因

你遇到的sqlite3.ProgrammingError是因为单个参数没有用元组/列表包装。当直接传递self.entry_id.get()(字符串类型)给cursor.execute()时,sqlite3会把字符串视为序列,将每个字符当作独立的绑定参数。比如输入的ID是"123456",就会被拆成6个参数,而你的SQL语句只需要1个,因此触发报错。

修正方案

1. 修复删除函数的参数传递

在elimina_Registro函数中,把单个ID参数包装成元组(注意末尾的逗号,否则会被当成普通变量而非元组):

def elimina_Registro(self):
    id_a_eliminar = self.entry_id.get()
    if not id_a_eliminar:
        messagebox.showwarning("警告", "请输入要删除的ID")
        return
    
    try:
        # 连接数据库(根据你的实际代码调整连接逻辑)
        conn = sqlite3.connect("你的数据库文件名.db")
        cursor = conn.cursor()
        # 用元组包装单个参数,逗号不能省略
        cursor.execute("DELETE FROM 你的表名 WHERE id = ?", (id_a_eliminar,))
        conn.commit()
        messagebox.showinfo("成功", "记录已删除")
        # 删除后更新Treeview
        self.actualizar_treeview()
    except sqlite3.Error as e:
        messagebox.showerror("错误", f"删除失败: {str(e)}")
    finally:
        if conn:
            conn.close()

2. 实现Treeview更新函数

添加actualizar_treeview函数,用于删除后重新加载数据到Treeview:

def actualizar_treeview(self):
    # 清空Treeview现有内容
    for item in self.tree.get_children():
        self.tree.delete(item)
    # 重新查询数据库数据
    conn = sqlite3.connect("你的数据库文件名.db")
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM 你的表名")
    registros = cursor.fetchall()
    # 将数据插入Treeview
    for registro in registros:
        self.tree.insert("", "end", values=registro)
    conn.close()

完整整合代码示例

import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3

class DatabaseGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("数据库增删改查界面")
        
        # 输入区组件
        ttk.Label(root, text="待删除ID:").grid(row=0, column=0, padx=5, pady=5)
        self.entry_id = ttk.Entry(root)
        self.entry_id.grid(row=0, column=1, padx=5, pady=5)
        
        self.boton_eliminar = ttk.Button(root, text="删除记录", command=self.elimina_Registro)
        self.boton_eliminar.grid(row=1, column=0, columnspan=2, padx=5, pady=5)
        
        # Treeview展示区
        # 替换columns为你的表实际字段
        self.tree = ttk.Treeview(root, columns=("ID", "字段1", "字段2", "字段3", "字段4", "字段5"), show="headings")
        # 设置表头文本
        self.tree.heading("ID", text="ID")
        self.tree.heading("字段1", text="字段1")
        self.tree.heading("字段2", text="字段2")
        self.tree.heading("字段3", text="字段3")
        self.tree.heading("字段4", text="字段4")
        self.tree.heading("字段5", text="字段5")
        self.tree.grid(row=2, column=0, columnspan=2, padx=5, pady=5, sticky="nsew")
        
        # 初始化加载数据
        self.actualizar_treeview()
    
    def elimina_Registro(self):
        id_a_eliminar = self.entry_id.get()
        if not id_a_eliminar:
            messagebox.showwarning("警告", "请输入要删除的ID")
            return
        
        try:
            conn = sqlite3.connect("你的数据库文件名.db")
            cursor = conn.cursor()
            cursor.execute("DELETE FROM 你的表名 WHERE id = ?", (id_a_eliminar,))
            conn.commit()
            messagebox.showinfo("成功", "记录已删除")
            self.actualizar_treeview()
        except sqlite3.Error as e:
            messagebox.showerror("错误", f"删除失败: {str(e)}")
        finally:
            if conn:
                conn.close()
    
    def actualizar_treeview(self):
        for item in self.tree.get_children():
            self.tree.delete(item)
        
        conn = sqlite3.connect("你的数据库文件名.db")
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM 你的表名")
        registros = cursor.fetchall()
        
        for registro in registros:
            self.tree.insert("", "end", values=registro)
        
        conn.close()

if __name__ == "__main__":
    root = tk.Tk()
    app = DatabaseGUI(root)
    root.mainloop()

注意事项

  • 替换代码中的你的数据库文件名.db、你的表名、字段1等为你的实际数据库信息。
  • 确保输入的ID与数据库中ID字段的类型匹配(比如整数/字符串),避免类型不兼容错误。

内容的提问来源于stack exchange,提问作者Daaayz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 00:47:28