1

tkinter を使用して Python でプログラムを作成しようとしています。このプログラムには、ユーザーが作成した本のリストが含まれているはずです。メイン ウィンドウ (リストが表示されているウィンドウ) には、リストに本を追加するオプションを含むメニュー バーが表示されます。このオプションをクリックすると、別のウィンドウが開きます。今回は、ユーザーが本のタイトルと追加ボタンを入力して、リストにボタンを追加する 1 つのエントリ ボックスが表示されます。

リストは .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 ファイルに改行が追加されるだけです。OS ライブラリを使用して、書籍の追加ウィンドウ用に別の python ファイルを作成すると機能することはわかっていますが、可能であれば、すべてを 1 つのコードにまとめたいと思います。いろいろ試してみたり、ネットで調べたりしましたが、どこにも行き着きませんでした。

4

1 に答える 1

2

問題の根本的な原因は、 のインスタンスを複数作成していることですTk。これはできません。ポップアップ ウィンドウを作成する場合は、 のインスタンスを作成しますToplevel。適切な Tkinter アプリケーションは、 の1 回のTk呼び出しで のインスタンスを 1 回だけ作成しますmainloop

(独自のダイアログの作成方法を学習するのではなく) 単純にユーザーから入力を取得することが主な目的である場合は、組み込みのダイアログの 1 つを使用することを検討してください。

例えば:

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()
于 2013-05-02T21:44:29.173 に答える