从sqlite列表中获取信息

时间:2019-07-10 22:33:23

标签: python sqlite tkinter

我有一个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)

代码要复杂得多,但我想我已经捕获了所需的帮助。就像我说的那样,我可以将所有数据库信息提取到内核中,但是表单仅检索数据库中的最后一个条目,而不是每个条目都创建自己的唯一信息。

1 个答案:

答案 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