为什么Tkinter条目输入没有反映在我连接它的sql表上?它正在生成空表记录

2024-10-01 00:36:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个数据库类,其实例应该是sql表。它有三种方法:一种是创建表

    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_结构方法)

    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)

对于GUI,我使用了tkinter,因此当我运行程序时,会出现一个包含4个条目和一个按钮的窗口

该按钮将insert_数据作为命令,并将字典“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、哺乳期、产奶量和体重中的值应插入到我创建的表中,但插入的值为空,因此每次单击按钮时,它都会创建一个空记录,我不知道为什么会发生这种情况

以下是所有代码:

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()

Tags: nameselfidtableplacerootdeletelabel