如何将我的数据库中的值插入到我的条目中? Tkinter
How to insert values from my database to my entries? Tkinter
当我试图将一些值从我的数据库插入到我的条目时,我不知道我做错了什么。我有一个使用相同代码运行良好的主界面,但我创建了一个辅助 window 并试图使工作几乎相同的代码但它不起作用。它给了我这个错误:
sqlite3.OperationalError: incomplete input
这是我的代码:
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()
来创建子 windows(就像 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()
方法,其工作方式相同。
当我试图将一些值从我的数据库插入到我的条目时,我不知道我做错了什么。我有一个使用相同代码运行良好的主界面,但我创建了一个辅助 window 并试图使工作几乎相同的代码但它不起作用。它给了我这个错误:
sqlite3.OperationalError: incomplete input
这是我的代码:
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()
来创建子 windows(就像 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()
方法,其工作方式相同。