Почему входные данные Tkinter не отображаются в таблице sql, к которой я ее подключил? Он создает записи пустой таблицы

#python #sql #python-3.x #tkinter #tkinter-entry

#python #sql #python-3.x #tkinter #tkinter-entry

Вопрос:

Я создал класс базы данных, экземплярами которого должны быть таблицы sql. У него есть 3 метода: один, который создает таблицу,

     def create_table(self, *args):
        c.execute('''CREATE TABLE IF NOT EXISTS {}  {} '''.format(self.table_name, args))
        conn.commit()
  

тот, который создает инструкцию sql INSERT INTO,

     def insert_structure(self,mydict, table_name):
        query = 'INSERT INTO {} VALUES ({}{})'
        d = dict(mydict)
        y = next(iter(d))
        # table = d.pop(y)
        columns = ',:'.join(d.keys())
        placeholders = ','.join(['{}'] * len(d))
        values = d.values()
        f = str(query.format(table_name,':', columns, placeholders))
        return f
  

и тот, который должен вставлять значения в таблицу (используя метод insert_structure).

     def insert_data(self,dicty, list):
        c.execute(self.insert_structure(dicty, self.table_name), dicty)
        conn.commit()
        for k in list:
            k.delete(0, END)
  

для графического интерфейса я использовал tkinter, поэтому при запуске программы появляется окно с 4 записями и кнопкой

Кнопка принимает insert_data как команду со словарем «dicto» в качестве аргумента (я использую lambda, поэтому предполагается, что это работает).

 dicto = {
                  'cow_id': cow_id.get(),
                  'lactation_phase': lactation_phase.get(),
                  'milk_production': milk_production.get(),
                  'weight': weight.get()
              }
entries = [cow_id, lactation_phase, milk_production, weight ]

cows.create_table('cow_id REAL', 'lactation_phase TEXT', 'milk_production REAL', 'weight REAL')
btn = Button(root, text = "Input cow's data", command = lambda : cows.insert_data(dicto, entries))
btn.place(x = 905, y = 350)
  

поэтому, когда я нажимаю кнопку, значения, введенные в записях cow_id, lactation_phase, milk_production и weight, должны быть вставлены в созданную мной таблицу, но вместо этого вставленные значения пустые, поэтому каждый раз, когда я нажимаю кнопку, создается пустая запись, и я понятия не имею, почему это происходит.

Вот весь код:

 import sqlite3
from tkinter import *
x = 0
root = Tk()
cow_id = Entry(root, width = 30)
cow_id.place(x= 340, y= 300 )
lactation_phase = Entry(root, width = 30)
lactation_phase.place(x = 525, y= 300)
milk_production = Entry(root, width = 30)
milk_production.place(x = 710, y = 300)
weight = Entry(root, width = 30)
weight.place(x= 895, y = 300)
cow_id_label = Label(root, text = "Cow Identification Number")
cow_id_label.place(x = 350, y= 270)
lactation_phase_label = Label(root, text= "Lactation phase")
lactation_phase_label.place(x= 545, y = 270)
milk_production_label = Label(root, text = "Milk production")
milk_production_label.place(x = 720, y = 270)
weight_label = Label(root, text = "Weight")
weight_label.place(x = 905, y = 270)
delete_label = Label(root, text = "To delete cow record enter cow ID" )
delete_label.place(x = 475, y = 500)
delete_entry = Entry(root)
delete_entry.place(x= 340, y = 500)
conn = sqlite3.connect("cows.db")
c = conn.cursor()

class databases:
    global c

    def __init__(self, table_name):
        self.table_name = table_name

    def insert_structure(self,mydict, table_name):
        query = 'INSERT INTO {} VALUES ({}{})'
        d = dict(mydict)
        y = next(iter(d))
        # table = d.pop(y)
        columns = ',:'.join(d.keys())
        placeholders = ','.join(['{}'] * len(d))
        values = d.values()
        f = str(query.format(table_name,':', columns, placeholders))
        return f
    def create_table(self, *args):
        c.execute('''CREATE TABLE IF NOT EXISTS {}  {} '''.format(self.table_name, args))
        conn.commit()
    def insert_data(self, dicty, list):
        c.execute(self.insert_structure(dicty, self.table_name), dicty)
        conn.commit()

        for k in list:
            k.delete(0, END)
        print(dicty)



    def delete_record(self, *args):
        c.execute('''DELETE FROM {} WHERE {} = {}'''.format(self.table_name, args))
        conn.commit()




cows = databases('cow')
dicto = {
                  'cow_id': cow_id.get(),
                  'lactation_phase': lactation_phase.get(),
                  'milk_production': milk_production.get(),
                  'weight': weight.get()
              }
entries = [cow_id, lactation_phase, milk_production, weight ]

cows.create_table('cow_id REAL', 'lactation_phase TEXT', 'milk_production REAL', 'weight REAL')
btn = Button(root, text = "Input cow's data", command = lambda : cows.insert_data(dicto, entries))
btn.place(x = 905, y = 350)
#btn2 = Button(root, text = "Delete", command = cows.delete_record)
#btn2.place(x = 670, y = 500 )
root.mainloop()
  

Комментарии:

1. Что вы сделали для отладки этого? Например, вы убедились, что значения непосредственно перед вставкой соответствуют вашим ожиданиям?

2. Я сделал, и значения не такие, какими я их ожидал (это пустые строки). Entry.get () не возвращает пользовательский ввод, и я не знаю, почему это

3. Тогда вы, вероятно, можете удалить весь sql-код из вопроса, поскольку проблема не в sql, а скорее в коде, который подготавливает данные.

4. Я не могу сказать, имеет ли это какое-либо отношение к вашей проблеме, но def insert_data(self, dicty, list): ~ вам определенно не следует называть свой список list .