【问题标题】:Inserting data from Tkinter to Sqlite3 - sqlite3.OperationalError: near ")": syntax error将数据从 Tkinter 插入到 Sqlite3 - sqlite3.OperationalError: near ")": 语法错误
【发布时间】:2017-04-04 23:34:30
【问题描述】:

很多人都发布过这个错误,但我想不通。

这是我的 Tkinter GUI 的图片:

当用户点击保存时,我希望“Campaign”条目是数据库的名称,然后我希望将“Workers”条目添加到名为 (workers) 的表中。

我认为问题在于,当我尝试使用 for loopc.execute("insert into workersNames (workers)", element) 将信息添加到表格时,这可能只是问题之一。

import tkinter as tk
from tkinter import *
from tkinter.ttk import *
import sqlite3

class Research(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)

        self.parent = parent
        self.initUI()

    def initUI(self):

        self.parent.title("")
        self.style = Style()
        self.style.theme_use("default")
        self.pack(fill=BOTH, expand=True)

        # CAMPAIGN 
        campFrame = Frame(self)
        campFrame.pack(fill=X)

        campLbl = Label(campFrame, text="Campaign: ", width=8)
        campLbl.pack(side=LEFT, padx=5, pady=5)

        campEntry = Entry(campFrame)
        campEntry.pack(fill=X, padx=5, expand=True)

        self.campStr = tk.StringVar()


        # CITY
        cityFrame = Frame(self)
        cityFrame.pack(fill=X)

        cityLbl = Label(cityFrame, text="City: ", width=8)
        cityLbl.pack(side=LEFT, padx=5, pady=8)

        cityEntry = Entry(cityFrame)
        cityEntry.pack(fill=X, padx=5, expand=True)

        self.cityStr = tk.StringVar()


        # PROVINCE
        provFrame = Frame(self)
        provFrame.pack(fill=X)

        provLbl = Label(provFrame, text="Province: ", width=8)
        provLbl.pack(side=LEFT, padx=5, pady=8)

        provEntry = Entry(provFrame)
        provEntry.pack(fill=X, padx=5, expand=True)

        self.provStr = tk.StringVar()


        # WORKERS
        workersFrame = Frame(self)
        workersFrame.pack(fill=X)

        workersLbl = Label(workersFrame, text="Workers: ", width=8)
        workersLbl.pack(fill=X, padx=5, expand=True)

        workersEntry1 = Entry(workersFrame)
        workersEntry1.pack(fill=X, padx=5, expand=True)

        self.workersStr1 = tk.StringVar()


        workersEntry2 = Entry(workersFrame)
        workersEntry2.pack(fill=X, padx=5, expand=True)

        self.workersStr2 = tk.StringVar()


        workersEntry3 = Entry(workersFrame)
        workersEntry3.pack(fill=X, padx=5, expand=True)

        self.workersStr3 = tk.StringVar()


        # SAVE
        saveFrame = Frame(self, relief=RAISED, borderwidth=1)
        saveFrame.pack(fill=BOTH, expand=True)

        saveButton = Button(self, text="Save", command = self.SaveDetails)
        saveButton.pack(side=RIGHT, padx=5, pady=5)


    def SaveDetails(self):
        # Create Database
        conn = sqlite3.connect(self.campStr.get() + ".db")
        c = conn.cursor()

        # Create Table - workersNames
        c.execute('''create table if not exists workersNames(
            workers text)''')
        conn.commit()

        # Add data to table
        names = [self.workersStr1.get(), self.workersStr2.get(), self.workersStr3.get()]

        for element in names:
            c.execute("insert into workersNames (workers)", element)
        conn.commit()

        c.close() 
        conn.close()



def main():
    root = Tk()
    root.geometry("300x300+300+300")
    app = Research(root)
    root.mainloop()

if __name__ == '__main__':
    main()

【问题讨论】:

  • 您的insert 声明没有说明要插入的内容。请参阅insert statement docs
  • @user2357112 我添加了values 所以它看起来像这样` c.execute("insert into workersNames values (workers)", element)` 但现在错误是sqlite3.OperationalError: no such column: workers 但我认为列是在我创建表的行中创建的?我使用link 作为我的代码的模型。

标签: python tkinter sqlite


【解决方案1】:

要将工作人员插入数据库,请使用:

c.execute("insert into workersNames (workers) values (?)", (element,))

我意识到你有很多 self.xx = tk.StringVar()s 没有连接到任何 tkinter 小部件。因此,当您调用sef.xx.get() 时,您会得到一个空字符串。我删除了 tk.StringVar()s 以使代码更短以进行测试,并在 tkinter 条目上使用 get() 方法来获取它们的内容。

因此:

names = [self.workersStr1.get(), self.workersStr2.get(), self.workersStr3.get()]

成为:

names = [self.workersEntry1.get(), self.workersEntry2.get(), self.workersEntry3.get()]

请注意,我使用 self 关键字将所有条目更改为类属性。

这里是完整的代码,你可以去看看变化:

#import tkinter as tk
#from tkinter import *
#from tkinter.ttk import *
#import sqlite3

import Tkinter as tk
from Tkinter import *
from ttk import *
import sqlite3

class Research(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)

        self.parent = parent
        self.initUI()

    def initUI(self):

        self.parent.title("")
        self.style = Style()
        self.style.theme_use("default")
        self.pack(fill=BOTH, expand=True)

        # CAMPAIGN 
        campFrame = Frame(self)
        campFrame.pack(fill=X)

        campLbl = Label(campFrame, text="Campaign: ", width=8)
        campLbl.pack(side=LEFT, padx=5, pady=5)

        self.campEntry = Entry(campFrame)
        self.campEntry.pack(fill=X, padx=5, expand=True)


        # CITY
        cityFrame = Frame(self)
        cityFrame.pack(fill=X)

        cityLbl = Label(cityFrame, text="City: ", width=8)
        cityLbl.pack(side=LEFT, padx=5, pady=8)

        cityEntry = Entry(cityFrame)
        cityEntry.pack(fill=X, padx=5, expand=True)


        # PROVINCE
        provFrame = Frame(self)
        provFrame.pack(fill=X)

        provLbl = Label(provFrame, text="Province: ", width=8)
        provLbl.pack(side=LEFT, padx=5, pady=8)

        provEntry = Entry(provFrame)
        provEntry.pack(fill=X, padx=5, expand=True)


        # WORKERS
        workersFrame = Frame(self)
        workersFrame.pack(fill=X)

        workersLbl = Label(workersFrame, text="Workers: ", width=8)
        workersLbl.pack(fill=X, padx=5, expand=True)

        self.workersEntry1 = Entry(workersFrame)
        self.workersEntry1.pack(fill=X, padx=5, expand=True)


        self.workersEntry2 = Entry(workersFrame)
        self.workersEntry2.pack(fill=X, padx=5, expand=True)


        self.workersEntry3 = Entry(workersFrame)
        self.workersEntry3.pack(fill=X, padx=5, expand=True)


        # SAVE
        saveFrame = Frame(self, relief=RAISED, borderwidth=1)
        saveFrame.pack(fill=BOTH, expand=True)

        saveButton = Button(self, text="Save", command = self.SaveDetails)
        saveButton.pack(side=RIGHT, padx=5, pady=5)


    def SaveDetails(self):
        # Create Database
        conn = sqlite3.connect(self.campEntry.get() + ".db")
        c = conn.cursor()

        # Create Table - workersNames
        c.execute('''create table if not exists workersNames(
            workers text)''')
        conn.commit()

        # Add data to table
        names = [self.workersEntry1.get(), self.workersEntry2.get(), self.workersEntry3.get()]

        for element in names:
            c.execute("insert into workersNames (workers) values (?)", (element,))
        conn.commit()

        c.close() 
        conn.close()



def main():
    root = Tk()
    root.geometry("300x300+300+300")
    app = Research(root)
    root.mainloop()

if __name__ == '__main__':
    main()

这会产生以下结果:

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2021-07-06
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    相关资源
    最近更新 更多