2017-04-04 161 views
-1

很多人发布了关于此错误的消息,但是我无法弄清楚。将数据从Tkinter插入到Sqlite3 - sqlite3.OperationalError:near“)”:语法错误

这是我的Tkinter GUI的一个画面:

当用户点击保存,我想“广告系列”条目是数据库的名称,然后我想“工人”的条目被添加到名为(工人)的表中。

我认为问题是当我尝试将信息添加到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() 
+0

你的'insert'语句没有说什么要插入。请参阅[插入语句文档](https://sqlite.org/lang_insert.html)。 – user2357112

+0

@ user2357112我添加了'values'看起来像这样'\t \t \t c.execute(“insert into workersNames values(workers)”,element)'但现在错误是sqlite3.OperationalError:no such column:workers'但我认为该列是在创建表的行中创建的?我使用[link](https://stackoverflow.com/questions/16120474/save-button-with-python-tkinter-sqlite)作为我的代码的模型。 – nasan

回答

2

要插入人员纳入数据库,请使用:

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

我意识到你有很多的未连接到任何Tkinter的部件self.xx = tk.StringVar()秒。因此,当您拨打sef.xx.get()时,您会收到一个空字符串。我删除了tk.StringVar()以使代码缩短以供测试,并在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() 

这将产生以下结果:

enter image description here

enter image description here

希望它有助于。

相关问题