我尝试使用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()
这对我来说似乎合乎逻辑,这应该有效,但它并没有。当我单击Add Book窗口中的ADD按钮时,它所做的就是将换行符添加到.txt文件中。 我知道如果我使用操作系统库并为添加书籍窗口创建一个单独的python文件,它会起作用,但是如果可能的话,我宁愿把它全部放在一个代码中。 我尝试过很多东西,并尝试在网上搜索,但我无处可去。
答案 0 :(得分: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()