当函数使用存储在另一个函数中的变量时,如何附加到sqlite数据库

时间:2016-11-04 13:54:14

标签: python sqlite tkinter

在我的程序中,我使用tkinter作为gui,我有条目,用户可以输入书籍的ID和书籍的名称,以将书籍添加到数据库记录(使用sqlite数据库)

def bookListEntry(event):
    top = Toplevel()
    top.title("Append to book list")
    bookIDLabel = Label(top, text= "bookID: ").grid(row = 0)
    bookIDEntry = Entry(top).grid(row = 0, column = 1)
    bookNamelabel = Label(top, text = "bookName: ").grid(row = 1)
    bookNameEntry = Entry(top).grid(row = 1, column = 1)
    quitButton = Button(top, text = "Exit", command = top.destroy)
    quitButton.grid(row = 2, column = 1)
    appendButton = Button(top, text = "Append", command = appendToBookList)
    appendButton.grid(row = 2, column = 2)


def appendToBookList():
    c.execute("INSERT INTO bookList VALUES (?, ?);",(bookIDEntry,    bookNameEntry))
    conn.commit()

但是,我收到错误“NameError:name'bookidentry'未定义” 我对全局变量和局部变量有所了解,而且我很确定它不起作用,因为它是一个局部变量,但我想不出有一种方法可以让appendToBookList()知道条目的值。 另外,另一个问题是我认为如果它有用,那么它可以在db中的字段中附加变量的名称,而不是在输入框中键入的内容。知道如何解决这些问题吗?谢谢

1 个答案:

答案 0 :(得分:0)

未经测试

def book_list_entry(event):
    top = Toplevel()
    top.title("Append to book list")

    Label(top, text="bookID: ").grid(row=0)

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

    Label(top, text="bookName: ").grid(row=1)

    book_name_entry = Entry(top)
    book_name_entry.grid(row=1, column=1)

    b = Button(top, text="Exit", command=top.destroy)
    b.grid(row=2, column=1)

    b = Button(top, text="Append", command=lambda:append_to_bookList(book_id_entry.get(), book_name_entry.get())
    b.grid(row=2, column=2)


def append_to_bookList(book_id, book_name):
    c.execute("INSERT INTO bookList VALUES (?, ?);", (book_id, book_name))
    conn.commit()

如果您需要变量var,则必须使用

var = Widget(...)
var.grid(...)

你无法做到

var = Widget(...).grid(...)

因为grid/pack/place返回None,您将在None而不是预期的小部件中获得var

如果您不需要var,那么

Widget(...).grid(...)

您必须使用entry.get()从条目中获取文字

book_id_entry.get(), book_name_entry.get()

您可以使用参数(条目中的文本)调用append_to_BookList,但您必须使用lambda来创建没有变量的匿名函数。

command=lambda:append_to_bookList(book_id_entry.get(), book_name_entry.get())

类似于

temp_function_name = lambda:append_to_bookList(book_id_entry.get(), book_name_entry.get())

Button( ..., command=temp_function_name)

我使用首选

  • lower_case_names用于功能和变量。
  • 在括号内=,没有空格。