首页 > 解决方案 > 将 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.

任何想法将不胜感激。

标签: pythonsqlitetkinter

解决方案


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小部件。


推荐阅读