我有一个SQLite数据库,可以使用用户输入的TKinter小部件将多个信息点放入(名称,DOB,位置等)中。
我为用户创建了一个表格,它工作正常。然后,我为管理员创建了一个“反向表单”。它从数据库中提取数据并将其重新插入为只读格式,以便管理员可以准确查看其提交方式。
然后,我创建了一个搜索功能,该功能显示了数据库的基本结果。然后,我使用了一个用于管理员的按钮,以单击通过反向形式显示更详细的信息。
我的问题是,当我拉出相反的表格时,它只会拉出搜索结果中的最后一个条目以填写表格。我需要为每个数据库条目提取相应的信息。
def retrieve_result(self):
con = sql_connect(self)
self.data_retrieval = con.cursor()
self.data_retrieval.execute('SELECT * FROM Raw_data WHERE first_name=(?)', (self.first_name_field.get(),))
return self.data_retrieval.fetchall()
sql_close(con)
def display_results(self):
results = self.retrieve_result()
for index, data_list in enumerate(results,10):
Button(self.frame, text=(data_list[0] +" " + data_list[1]),
command=self.retrieve_form).grid(row=index+1, column=0)
Label(self.frame, text=data_list[2]).grid(row=index+1, column=1)
self.db_first_name = StringVar(value=data_list[0])
self.db_last_name = StringVar(value=data_list[1])
self.db_dob = StringVar(value=data_list[2])
def retrieve_form(self):
self.first_name_field = Entry(self.frame, state=DISABLED, disabledbackground="gray95", disabledforeground="black",textvariable=self.db_first_name, bg="white")
self.first_name_field.grid(row=3, column=0, sticky=N)
self.last_name_field = Entry(self.frame, state=DISABLED, disabledbackground="gray95", disabledforeground="black", textvariable=self.db_last_name, bg="white")
self.last_name_field.grid(row=3, column=1, sticky=N)
self.age_field = Entry(self.frame, state=DISABLED, disabledbackground="gray95", disabledforeground="black", textvariable=self.db_dob, bg="white")
self.age_field.grid(row=5, column=0, sticky=N, padx=10)
代码要复杂得多,但我想我已经捕获了所需的帮助。就像我说的那样,我可以将所有数据库信息提取到内核中,但是表单仅检索数据库中的最后一个条目,而不是每个条目都创建自己的唯一信息。
答案 0 :(得分:0)
在for
循环中,您将所有值都赋给相同的变量
self.db_first_name = StringVar(value=data_list[0])
self.db_last_name = StringVar(value=data_list[1])
self.db_dob = StringVar(value=data_list[2])
所以只有最后一个值。
使用这些值更好地关联每个Button
函数,因此每个Button
将运行具有不同值的函数retrieve_form
。它需要lambda
函数来创建此函数,因为command
期望函数不带参数。
def display_results(self):
results = self.retrieve_result()
for index, data_list in enumerate(results,10):
a = data_list[0]
b = data_list[1]
c = data_list[2]
Button(self.frame,
text=...,
command=lambda x=a, y=b, z=c:self.retrieve_form(x, y, z)
).grid(...)
Label(self.frame, text=...).grid(...)
函数必须获取值并与text=
def retrieve_form(self, a, b, c):
self.first_name_field = Entry(self.frame, text=a, ...)
self.last_name_field = Entry(self.frame, text=b, ...)
self.age_field = Entry(self.frame, text=b, ...)
# rest
lambda
必须使用x=a, y=b, z=c
,因为lambda:self.retrieve_form(a, b, c)
将对所有按钮使用相同的最后一个值。
您可以使用index
代替值,但必须将值保留在self.results
中而不是`results
def display_results(self):
self.results = self.retrieve_result() # <-- self
for index, data_list in enumerate(results,10):
Button(self.frame,
text=...,
command=lambda x=index:self.retrieve_form(x)
).grid(...)
Label(self.frame, text=...).grid(...)
def retrieve_form(self, index):
data_list = self.results[index]
a = data_list[0]
b = data_list[1]
c = data_list[2]
self.first_name_field = Entry(self.frame, text=a, ...)
self.last_name_field = Entry(self.frame, text=b, ...)
self.age_field = Entry(self.frame, text=b, ...)
# rest