无法使用tkinter作为gui来搜索sqlite数据库中的记录,以输入我要搜索的记录的名称(Python)

时间:2016-11-10 10:42:48

标签: python sqlite tkinter

我正在使用数据库为库创建程序,以存储有关书籍的详细信息,并将tkinter作为gui。该程序的一个功能是用户可以输入书籍的名称,它将搜索数据库并返回包含该名称的书籍的记录。以下是我目前对此功能的代码:

def bookSearch(event):
top = Toplevel()
top.title("Book Search")

Label(top, text = "Enter the name of the book you are searching for:      ").grid()

bookSearchEntry = Entry(top)
bookSearchEntry.grid(row = 0, column = 1)

getRecord = c.execute("SELECT * FROM bookList WHERE BookName = (?)", bookSearchEntry.get())

def printRecords(event):
    for row in getRecord:
        t = Text(top, height = 400, width = 50)
        t.pack()
        t.insert(END, getRecord)

bookSearchButton = Button(top, text = "Search", command = printRecords)
bookSearchButton.grid(row = 0, column = 1)

我收到此错误消息:

getRecord = c.execute("SELECT * FROM bookList WHERE BookName = (?)", bookSearchEntry.get())
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 0 supplied.

我已经看到其他帖子说要添加逗号来制作元组,但即使使用

getRecord = c.execute("SELECT * FROM bookList WHERE BookName = (?)", bookSearchEntry.get,())

我仍然收到错误消息,但是,这是错误消息:

getRecord = c.execute("SELECT * FROM bookList WHERE BookName = (?)", bookSearchEntry.get,())
TypeError: function takes at most 2 arguments (3 given)

我已经坚持了很久,感谢任何帮助,谢谢

2 个答案:

答案 0 :(得分:0)

我认为这是因为execute方法的第二个参数必须是一个元组。所以你应该把它写成:

getRecord = c.execute("SELECT * FROM bookList WHERE BookName = (?)", (bookSearchEntry.get(),))

答案 1 :(得分:0)

我将只关注第一个错误并忽略第二个错误,因为它似乎偏离了核心问题。

这是说明的错误信息:
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 0 supplied.

当我在我的设置中尝试时,它会给我类似的错误:
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 16 supplied.

16表示我输入的值"三聚氰胺烟灰缸"包含16个字符。很明显,代码中的WHERE条件似乎没有字符,即0内容。

  1. 您的代码失败,因为当 bookSearchEntry.get()发生时,没有任何内容可以获取,因为它不在您的 bookSearchButton 命令中。最好将get()与诸如Button click之类的事件绑定在一起。
  2. 目前尚不清楚光标如何在没有 fetchall()
  3. 的情况下将值直接保存到 getRecords
  4. 在下面的示例中,需要一个变量来获取声明为z的值。
  5. 我做了一些修改,并按照以下更好的顺序重写了代码,它的工作原理如下:

    from Tkinter import *
    import sqlite3
    
    def printRecords():
        connection = sqlite3.connect('your_DB_name')
        cur = connection.cursor()
        cur.execute("select column_name  from table_name where  book_name = ?", (z.get(),))
        connection.commit()
        variablename = cur.fetchall()
        print variablename
    
    root = Tk()
    root.title ( "Search a Book")
    
    z= StringVar()
    
    #Label
    Label(root, text = "Enter the name of the book you are searching for:      ").grid()
    #Textbox
    bookSearchEntry = Entry(root, textvariable = z)
    bookSearchEntry.grid(row = 0, column = 1)
    #Button
    bookSearchButton = Button(root, text = "Search", command = printRecords)
    bookSearchButton.grid(row = 0, column = 2)
    
    root.mainloop()