【发布时间】:2020-05-31 23:13:51
【问题描述】:
我正在使用 python、tkinter 和 sqlite 创建费用跟踪器。我希望用户将他们的费用输入到使用下拉菜单提供的类别中。但是,当我在任何一个类别中输入金额时,都会收到错误消息。我不确定如何解决此错误(我是初学者),请告知。以下是确切的错误:
Exception in Tkinter callback
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/tkinter/__init__.py", line 1883, in __call__
return self.func(*args)
File "/Users/hetparikh/PycharmProjects/BudCalculator/test.py", line 38, in SaveExpenseType
c.execute('INSERT INTO AMOUNTS (sql_date, sql_Expense, sql_clicked) VALUES (?, ?, ?)',
sqlite3.OperationalError: table AMOUNTS has no column named sql_date
以下是我的代码:
from tkinter import *
import sqlite3 as sq
import datetime
# Connect to SQLite
con = sq.connect('budCalc.db')
root = Tk()
# Options in dropdown menu
options = [
'Food',
'Transportation',
'Entertainment',
'Misc'
]
# Drop down menu
clicked = StringVar()
clicked.set('Expense')
drop = OptionMenu(root, clicked, *options,)
drop.grid(row=0, column=2, padx=20)
Expense = Entry(root, width=30)
Expense.grid(row=0, column=1, padx=20)
delete_box = Entry(root, width=20)
delete_box.grid(row=10, column=2)
# Function for inserting input into SQLite
def SaveExpenseType():
c = con.cursor()
c.execute('CREATE TABLE IF NOT EXISTS AMOUNTS (sql_date VARCHAR(20), sql_Expense VARCHAR(20), sql_clicked VARCHAR(20) NOT NULL)')
today = str(datetime.date.today())
today = today[8:] + '-' + today[5:7] + '-' + today[:4]
c.execute('INSERT INTO AMOUNTS (sql_date, sql_Expense, sql_clicked) VALUES (?, ?, ?)',
(today, float(Expense.get()), clicked.get()))
con.commit()
# CREATE FUNCTION TO DELETE A RECORD
def delete():
conn = sq.connect('budCalc.db')
c = conn.cursor()
# DELETE A RECORD
c.execute("DELETE from amounts WHERE oid = " + delete_box.get())
conn.commit()
conn.close()
def query():
conn = sq.connect('budCalc.db')
c = conn.cursor()
c.execute("SELECT *, oid FROM amounts")
records = c.fetchall()
print_records = ''
for record in records:
print_records += "Date: " + str(record[0]) + ", Amount Spent: $" + str(record[1]) + ", Category: " + str(record[2]) + " " + str(record[3]) + "\n" + "\n"
query_label = Label(root, text=print_records)
query_label.grid(row=8, column=0, columnspan=2)
conn.commit()
conn.close()
# CREATE A DELETE BUTTON
delete_btn = Button(root, text="Delete Record", command=delete)
delete_btn.grid(row=10, column=0, columnspan=2, pady=10, padx=10, ipadx=137)
# Query Button
query_btn = Button(root, text="Show Records", command=query)
query_btn.grid(row=7, column=0, columnspan=2, pady=10, padx=10, ipadx=137)
# Button for user to activate the function inserting data into SQLite
carB = Button(root, text="Enter", command=SaveExpenseType)
carB.grid(row=1, column=2)
root.mainloop()
【问题讨论】:
-
您之前是否可以使用不同的架构初始化表
AMOUNTS?因为CREATE TABLE IF NOT EXISTS不会检查以确保架构匹配。如果是这种情况,您只需删除.db文件或手动删除表并让脚本重新创建表。 -
情况并非如此,因为我刚刚手动删除了 budCalc.db 文件,但仍然收到相同的错误。 @notacorn
-
你可以试试打印
c.execute("SELECT sql FROM sqlite_master WHERE name = 'AMOUNTS';") -
如果对象不详,只需用
list()包装即可 -
你想让我在哪里插入那行代码@notacorn
标签: python database sqlite tkinter