【问题标题】:How to insert values from my database to my entries? Tkinter如何将数据库中的值插入到我的条目中?特金特
【发布时间】:2025-12-25 01:25:07
【问题描述】:

当我尝试将一些值从我的数据库插入到我的条目时,我不知道自己做错了什么。我有一个使用相同代码的主界面运行良好,但我创建了一个辅助窗口并试图使几乎相同的代码工作但它不工作。它给了我这个错误:

sqlite3.OperationalError: 输入不完整

这是我的代码:

myid = StringVar()
myname = StringVar()
myowner = StringVar()
mycel = StringVar()

id_entry = Entry(windows2, textvariable=myid)
name_entry = Entry(windows2, textvariable=myname)
owner_id = Entry(windows2, textvariable=myowner)
cel_id = Entry(windows2, textvariable=mycel)

btn_search = Button(windows2, text='SEARCH', command=lambda: search())
btn_search.place(x=930, y=12, width='60', height='26')

def search():

    conn = sqlite3.connect('db1.db')
    c = conn.cursor()
    c.execute("SELECT * FROM regis WHERE idcard=" + myid.get())

    theuser = c.fetchall()

    for user in theuser:
        myid.set(user[0])
        myname.set(user[1])
        myowner.set(user[8])
        mycel.set(user[9])

    conn.commit()

    if theuser:
       messagebox.showinfo(title='ID Found', message='User found')

    else:
       messagebox.showerror(tittle=None, message='Wrong ID')

【问题讨论】:

  • 在执行SQL语句前打印出myid.get()的值,看看是否有你期望的值。
  • @acw1668 它显示了同样的错误,这很有趣,因为我尝试使用在我的第一个窗口中运行良好的相同代码,但在我的第二个窗口中不起作用
  • 您很可能使用Tk() 作为您的第二个窗口。请改用Toplevel()
  • @acw1668 wow mate,它现在可以工作了,我还没有考虑过=D
  • 另一个建议:在 SQL 语句中使用占位符,如 c.execute("SELECT * FROM regis WHERE idcard=?", [myid.get()]),以避免 SQL 注入。

标签: python python-3.x sqlite tkinter tkinter-entry


【解决方案1】:

说明:

您应该做的是向所有 tkinter 小部件添加 master 参数。当我们创建Tk() 时,它会创建一个tcl 解释器。每个tcl 解释器都有自己的小部件内存。所以当你说StringVar()时,它不知道属于哪个tcl解释器,所以它隐式使用了第一个创建的Tk()。但是第一个创建的Tk() 可能不包含您将StringVar 关联到(与textvariable)的小部件,因此它不会存储其值。

解决方案:

您可以做的是,要么明确提及 Tk() 属于哪个实例,要么使用 Toplevel() 创建子窗口(如 acw1668 提及的)。

StringVar(master=newwindow) # Same with other tkinter variables and all widgets too

newwindow = Toplevel() # Recommended because tkinter was made to work like this?

还要确保清理您的输入,使其不易受到 SQL 注入:

c.execute("SELECT * FROM regis WHERE idcard=?",(myid.get(),))

尽管我永远不会将StringVar 用于条目小部件,只要我必须在它们上使用trace。他们有自己的get() 方法,其工作方式相同。

【讨论】: