【问题标题】:Pulling information from a sqlite list从 sqlite 列表中提取信息
【发布时间】:2019-07-10 22:33:23
【问题描述】:

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

代码要复杂得多,但我想我捕捉到了需要帮助的内容。就像我说的,我可以将所有数据库信息拉入内核,但表单只检索数据库中的最后一个条目,而不是每个条目创建自己的唯一信息。

【问题讨论】:

    标签: python sqlite tkinter


    【解决方案1】:

    for-loop 中,您将所有值分配给相同的变量

        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
    

    【讨论】:

    • 不幸的是,这对我没有帮助。它给了我一个索引错误。它将 data_list 视为原始嵌套列表(130 个子值的 2 个样本值)。所以 data_list[0] 是 [First Name Last Name DOB etc] 而不是 [First Name]。
    • 您使用第二个版本吗?你用data_list = self.results[index]了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多