如何将数据库中的值插入到条目中?Tkinter



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

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')

解释:

您应该做的是向所有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()方法,其工作方式相同。

相关内容

  • 没有找到相关文章

最新更新