'probably unsupported type.' 将 Tkinter 与 SQLite 一起使用时收到错误消息



这是我在我的SQLite数据库中创建的一个名为'RawMaterials'的表。这段代码直接位于下面的Class之上。

self.c.execute("""CREATE TABLE RawMaterials (
date integer,
po integer,
stock integer,
batch integer,
recieved integer,
test text,
result text,
comment text
)""")

下面的类使用字典和for循环为Tkinter应用程序创建几个条目。下面的方法def submit(self):试图检索这些条目中的信息,并将信息输入到上面所示的sqlite数据库表中。然而,这是不工作,我不知道为什么或如何绕过这个障碍。

class RawMaterials:
def __init__(self, master):
self.conn = sqlite3.connect('qualitycontrol.db')
self.c = self.conn.cursor()
self.entry_dict = {'Date': {'master' : self.myFrame, 'column' : 1, 'row' : 0},
'PO Number': {'master' : self.myFrame, 'column' : 1, 'row' : 1},
'stock Code': {'master' : self.myFrame, 'column' : 1, 'row' : 2},
'Batch': {'master' : self.myFrame, 'column' : 1, 'row' : 3},
'Sample Recieved': {'master' : self.myFrame, 'column' : 1, 'row' : 4},
'Test': {'master' : self.myFrame, 'column' : 1, 'row' : 5},
'Result': {'master' : self.myFrame, 'column' : 1, 'row' : 6},
'Comments': {'master' : self.myFrame, 'column' : 1, 'row' : 7}}
for entries, info in self.entry_dict.items():
entries = tk.Entry(master=info['master'], relief=GROOVE)
entries.grid(row=info['row'], column=info['column'], padx=10, pady=5)
self.submitButton = tk.Button(self.myFrame, text=("Submit"), relief=GROOVE, command = 
self.submit, width=30)
self.submitButton.grid(row=8, column=0, padx=10, pady=5, columnspan=2)
def submit(self):
# INSERT ENTRY FIELDS TO DB TABLE
self.c.execute("INSERT INTO RawMaterials VALUES (:date, :po, :stock, :batch, 
:recieved, :test, :result, :comment)",
{
'date': self.entry_dict.get('Date'),
'po': self.entry_dict.get('PO Number'),
'stock': self.entry_dict.get('stock Code'),
'batch': self.entry_dict.get('Batch'),
'recieved': self.entry_dict.get('Sample Recieved'),
'test': self.entry_dict.get('Test'),
'result': self.entry_dict.get('Result'),
'comment': self.entry_dict.get('Comments'),
})
# COMMIT AND CLOSE DB CONNECTION
self.conn.commit()
self.conn.close()

这是我在运行这段代码时收到的错误,填写条目并点击与提交方法绑定的提交按钮:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:Program 
FilesWindowsAppsPythonSoftwareFoundation.Python.3.9_3.9.1776.0_x64__qbz5n2kfra8p0
libtkinter__init__.py", line 1892, in __call__
return self.func(*args)
File "c:UsersleonhillDesktopsqliteapp.py", line 80, in submit
self.c.execute("INSERT INTO RawMaterials VALUES (:date, :po, :stock, :batch, :recieved, 
:test, :result, :comment)",
sqlite3.InterfaceError: Error binding parameter :date - probably unsupported type.

如有任何意见,不胜感激。

您可以使用创建的Entry小部件覆盖self.entry_dict的值:

def __init__(self, master):
...
for field, info in self.entry_dict.items():
entry = tk.Entry(master=info['master'], relief=tk.GROOVE)
entry.grid(row=info['row'], column=info['column'], padx=10, pady=5)
self.entry_dict[field] = entry  # replace the dict by entry
...

然后您需要更新submit()以调用Entry部件上的get():

def submit(self):
# INSERT ENTRY FIELDS TO DB TABLE
self.c.execute("INSERT INTO RawMaterials VALUES (:date, :po, :stock, :batch, :recieved, :test, :result, :comment)",
{
'date': self.entry_dict['Date'].get(),
'po': self.entry_dict['PO Number'].get(),
'stock': self.entry_dict['stock Code'].get(),
'batch': self.entry_dict['Batch'].get(),
'recieved': self.entry_dict['Sample Recieved'].get(),
'test': self.entry_dict['Test'].get(),
'result': self.entry_dict['Result'].get(),
'comment': self.entry_dict['Comments'].get(),
})
# COMMIT AND CLOSE DB CONNECTION
self.conn.commit()
self.conn.close()

请注意,如果您不想覆盖self.entry_dict,则需要创建另一个dict来存储这些Entry小部件。

最新更新