2016-11-04 69 views
0

在我的程序中,我使用tkinter作爲gui,並且我擁有用戶可以在其中輸入書的ID和書名的條目本書添加到數據庫中的記錄(使用sqlite的DB)當函數使用存儲在另一個函數中的變量時如何附加到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:名字‘bookIDEntry’沒有定義」 我對全局和局部變量的知識和我米prety確定它不工作,因爲它是一個局部變量,但我想不出一種方法appendToBookList()瞭解條目的值。 此外,另一個問題是,我認爲如果它的工作,那麼它可能會在數據庫的字段中追加變量的名稱,而不是輸入到輸入框中的內容。想知道如何解決這些問題?謝謝

+0

您需要在UI中查詢這些項目的選擇位置。 例如,要求BookNameEntry的值是 – Ajurna

+0

,你必須使用'全局'變量。或從'bookListEntry'和後來的'appendToBookList(變量)'返回變量。或者用所有代碼創建類,然後使用'self.' – furas

+0

這些應該是類方法。而像BookNameEntry這樣的項目應該被分配給自己,這樣它就可以在課程中的任何地方訪問,並且可以通過這種方式共享信息。 – Ajurna

回答

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,您將在var中獲得None,而不是預期的小部件。

如果您不需要var比你可以做

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

你必須使用entry.get()獲得從入門

book_id_entry.get(), book_name_entry.get() 

文本可以調用append_to_BookList與參數(來自條目的文本),但您必須使用lambda來創建anony沒有變量的鼠標功能。

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函數和varaibles。
  • 括號內=無空格。
+0

謝謝我運行該代碼,它第一次工作!但是現在它已經鎖定了數據庫,所以我不能再向圖書清單中添加任何書籍。我看不出它是如何鎖定數據庫的,因爲在代碼的任何地方都沒有c.close()。任何想法爲什麼發生這種情況? – JoeW373

+0

@ JoeW373我不知道 - 你必須用新的源代碼來創建新的問題來顯示問題。當您在console/terminal/cmd.exe/powershell中運行時,可能會收到一些錯誤消息。 – furas

+0

沒關係,我自己解決了,我只是在光標連接上放了一個10秒的超時時間,只要你在最後一個10秒後添加一個新記錄,一切正常。非常感謝你的幫助 :) – JoeW373

相關問題