Извлечение информации из списка sqlite - PullRequest
0 голосов
/ 11 июля 2019

У меня есть база данных SQLite, в которую я помещаю несколько точек информации (имя, DOB, местоположение и т. Д.), Используя пользовательский ввод виджетов TKinter.

Я создал форму для пользователей, и она отлично работает.Затем я создал «обратную форму» для администраторов.Он извлекает данные из базы данных и вставляет их обратно в формат только для чтения, чтобы администраторы могли точно видеть, как они были отправлены.

Затем я создал функцию поиска, которая отображает основные результаты из базы данных.Затем я использовал кнопку для администраторов, чтобы нажать, чтобы получить более подробную информацию через обратную форму.

Моя проблема в том, что когда я перетаскиваю обратную форму, она тянет только последнюю запись в результатах поиска, чтобы заполнить форму.Мне нужно, чтобы каждая запись в базе данных подтягивала соответствующую информацию, которая идет вместе с ней.

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 голосов
/ 11 июля 2019

В 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...