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

Tkinter文本框修改后数据库无法更新,报sqlite3语法错误

问题解决:SQLite更新语句语法错误及Entry值同步问题

错误原因

你的代码存在两个核心问题:

  • UPDATE语句缺少WHERE子句:没有指定要更新哪一行记录,同时你传入了两个参数,但SQL语句中只有一个占位符?,参数数量与占位符不匹配,直接触发sqlite3.OperationalError语法错误。
  • 未提交数据库修改:即使语句正确,没有调用commit()的话,修改只会停留在内存,不会真正写入数据库。

解决方案

需要分别针对id=1和id=2的记录执行独立的UPDATE操作,同时补充初始化时从数据库加载值到Entry的逻辑,满足初始显示需求。

修正后的完整代码

import tkinter as tk
from tkinter import ttk
import sqlite3

class App:
    def __init__(self, root):
        self.root = root
        
        # 创建两个Entry控件
        self.x = ttk.Entry(root, width=7)
        self.x.place(x=420, y=30)
        
        self.y = ttk.Entry(root, width=7)
        self.y.place(x=420, y=55)
        
        # 初始化加载数据库中的初始值
        self.load_initial_values()
        
        # 创建更新按钮
        update_btn = tk.Button(root, text="Update Value", command=self.update_values)
        update_btn.place(x=0, y=0)
    
    def load_initial_values(self):
        """从数据库读取id=1和id=2的值,填充到Entry"""
        conn = sqlite3.connect('your_database.db')  # 替换为你的数据库文件路径
        cursor = conn.cursor()
        
        # 获取id=1的valori值
        cursor.execute("SELECT valori FROM Valori_Textbox WHERE id=1")
        x_value = cursor.fetchone()[0]
        self.x.insert(0, x_value)
        
        # 获取id=2的valori值
        cursor.execute("SELECT valori FROM Valori_Textbox WHERE id=2")
        y_value = cursor.fetchone()[0]
        self.y.insert(0, y_value)
        
        conn.close()
    
    def update_values(self):
        """更新数据库中对应id的valori字段"""
        # 获取Entry中的新值
        new_x = self.x.get()
        new_y = self.y.get()
        
        # 连接数据库执行更新
        conn = sqlite3.connect('your_database.db')
        cursor = conn.cursor()
        
        # 分别更新id=1和id=2的记录
        cursor.execute("UPDATE Valori_Textbox SET valori=? WHERE id=?", (new_x, 1))
        cursor.execute("UPDATE Valori_Textbox SET valori=? WHERE id=?", (new_y, 2))
        
        # 提交修改并关闭连接
        conn.commit()
        conn.close()

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

关键说明

  • 精准定位更新行:每个UPDATE语句通过WHERE id=?指定要修改的记录,参数数量与占位符一一对应,解决语法错误。
  • 提交修改:必须调用conn.commit()才能将内存中的修改写入数据库。
  • 初始化加载:新增load_initial_values方法,启动时自动从数据库读取初始值填充到Entry,满足“x显示50、y显示60”的需求。
  • 控件封装:使用类管理控件和方法,避免全局变量带来的问题,代码结构更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:55:25