2013-05-02 36 views
1

我想在使用tkinter的python中創建一個程序,並且這個程序應該有一個由用戶創建的書籍列表。在主窗口(帶有列表的那個窗口)上,應該有一個菜單欄,可以選擇將書添加到列表中。點擊後,此選項應打開另一個窗口,這次有一個輸入框,用戶應輸入書名和添加按鈕,將按鈕添加到列表中。如何打開另一個窗口並從中獲取數據,然後保存到文件中?

該列表保存在.txt文件中。

這是我寫到目前爲止程序:

import sys 
from tkinter import * 

def newBook(): 
    def add(): 
     BookTitle = v.get() 
     bookTitle = '\n' + BookTitle 
     books = open('c:/digitalLibrary/books.txt', 'a') 
     books.write(bookTitle) 
     books.close() 

    addWindow = Tk() 
    v = StringVar() 

    addWindow.geometry('250x40+500+100') 

    addWindow.title('digitalLibrary - Add Book') 

    newBookEntry = Entry(addWindow,textvariable=v) 
    newBookEntry.pack() 

    addButton = Button(addWindow, text='ADD', command=add) 
    addButton.pack() 

def refresh(): 
    books = open('c:/digitalLibrary/books.txt', 'r') 
    bookList = books.readlines() 
    books.close() 

    for i in range (0, len(bookList)): 
     bookOne = Label(text=bookList[i]) 
     bookOne.grid(row=i, column=0, sticky=W) 

def quitProgram(): 
    tfQuit = messagebox.askyesno(title='Close Program', message='Are you sure?') 
    if tfQuit: 
     window.destroy() 

window = Tk() 
menubar = Menu(window) 

window.geometry('400x400+200+100') 

window.title('digitalLibrary') 

booksmenu = Menu(menubar, tearoff=0) 
booksmenu.add_command(label='Add Book', command=newBook) 
booksmenu.add_command(label='Delete Book') 
booksmenu.add_command(label='Close Program', command=quitProgram) 
menubar.add_cascade(label='digitalLibrary', menu=booksmenu) 

books = open('c:/digitalLibrary/books.txt', 'r') 
bookList = books.readlines() 
books.close() 

for i in range (0, len(bookList)): 
    bookOne = Label(window, text=bookList[i]) 
    bookOne.grid(row=i, column=0, sticky=W) 


refreshButton = Button(window, text='Refresh', command=refresh) 
refreshButton.grid(row=0, column=1) 

window.config(menu=menubar) 

window.mainloop() 

這似乎是合乎邏輯,我認爲這應該工作,但它只是沒有。當我單擊添加書籍窗口上的添加按鈕時,它所做的只是將換行符添加到.txt文件。 我知道如果我使用操作系統庫併爲添加書籍窗口創建一個單獨的python文件,它可以工作,但如果可能的話,我寧願將它全部放在一個代碼中。 我已經嘗試了很多東西,並嘗試在網絡中搜索它,但我無處可去。

回答

2

問題的根本原因在於您正在創建多個Tk實例。你不可以做這個。如果您想創建一個彈出窗口,請創建一個Toplevel的實例。一個恰當的Tkinter應用程序恰好創建一個Tk的實例,只需調用一次mainloop

如果您的主要目標是簡單地從用戶處獲得輸入(而不是學習如何編寫自己的對話框),那麼您可能需要考慮使用其中一個內置對話框。

例如:

import tkinter.simpledialog as tkSimpleDialog # python 3.x 
... 
def newBook(): 
    BookTitle = tkSimpleDialog.askstring("Add Book","What is the name of the book?") 
    if BookTitle is not None: 
     bookTitle = '\n' + BookTitle 
     books = open('/tmp/books.txt', 'a') 
     books.write(bookTitle) 
     books.close() 
+0

太感謝你了,它的工作完美。 – AugustoQ 2013-05-02 23:36:46

相關問題