python - 将 Tkinter 与 SQLite 一起使用时收到错误消息,“可能不受支持的类型”。
问题描述
这是我在名为“RawMaterials”的 SQLite 数据库中创建的表。此代码直接位于以下类的上方。
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
Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.1776.0_x64__qbz5n2kfra8p0
\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
File "c:\Users\leonhill\Desktop\sqlite\app.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.
任何想法将不胜感激。
解决方案
self.entry_dict
您可以使用创建的小部件覆盖 的值Entry
:
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()
以调用get()
这些Entry
小部件:
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
小部件。
推荐阅读
- python - 在databricks中导入python依赖项(无法导入模块)
- flutter - Flutter:local_auth:^0.6.1:PlatformException(错误,您需要在此活动中使用 Theme.AppCompat 主题(或后代)。,null)
- python - 使用分数距离作为 Python 中高维数据集的 K 均值聚类的距离度量
- rabbitmq - 如何使用 RabbitMQ 管理插件将字节数组发布到队列?
- c++ - 二维向量 for-loop c++
- go - use direnv then the gopls error said can't import fmt
- dart - Dart pub.dev 显示“没有有效的 SDK”
- python - Python wrapper for C++ class (when only ".h" and ".dll" files are available)
- c++ - Why do I need to use std::this_thread::yield() for this program to work correctly?
- bash - Can't seem to use more than one -c argument for tesseract