如何打开另一个窗口并从中获取数据,然后保存到文件中?

2024-09-29 23:28:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用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文件中。 我知道,如果我使用OS库并为addbook窗口创建一个单独的python文件,它是可行的,但是如果可能的话,我宁愿把它全部放在一个代码中。 我尝试了很多方法,并尝试在网上搜索,但我一无所获。在


Tags: texttxtadd列表defwindowbookslabel
1条回答
网友
1楼 · 发布于 2024-09-29 23:28:09

问题的根本原因是您创建了多次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()

相关问题 更多 >

    热门问题