0

ユーザーが名前を入力した後で入力フィールドを削除しようとしていますが、次のコードを使用するとエラーが発生します。

from Tkinter import *
from random import randrange

class Application(Frame):
    def __init__(self):

        Frame.__init__(self)
        self.grid()

        self.nameEntry = Entry(self)
        self.nameEntry.grid(row=0, column=0, columnspan=4)

        self.setupBtn = Button(self, text = "Generate", command=self.setup)
        self.setupBtn.grid(row=4, column=0, columnspan=4)

        self.preText = Text(self, width=50, height=3, wrap=WORD)
        self.preText.grid(row=6, column=0, columnspan=4)
        self.preText.delete(0.0, END)
        self.preText.insert(0.0, "If you enter your name, i'll give you a random                         number each time!")

        self.statusLbl = Label(self, text="What's your name?", bg="white")
        self.statusLbl.grid(row=7, column=0, columnspan=4, sticky=W)

    def setup(self):        
        name = self.nameEntry.get()
        if name != "":
            self.nameEntry.destroy()
            self.setupBtn = Button(self, text = "Roll Again", command=self.setup)
            self.setupBtn.grid(row=4, column=0, columnspan=4)

        randomNumber = randrange(10, 100)
        if name == "":
            message = "Your name please!"

            self.preText.delete(0.0, END)
            self.preText.insert(0.0, message)
        else:
            self.preText.delete(0.0, END)
            self.preText.insert(0.0, str(randomNumber))

Application().mainloop() 

エラーは次のとおりです。

Tkinterコールバックトレースバックの例外(最後の最後の呼び出し):

File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__ return self.func(*args)   
File "C:/Users/User/Desktop/app.py", line 25, in setup name = self.nameEntry.get()
File "C:\Python27\lib\lib-tk\Tkinter.py", line 2391, in get return self.tk.call(self._w, 'get') 
TclError: invalid command name ".45073096L.45073736L"

ユーザーが名前を入力してロールボタンをクリックした後、名前入力フィールドを削除したいと思います。しかし、ローリングする代わりに、そのエラーが発生します。

誰かが私を助けることができますか?私の知る限り、name = self.nameEntry.get()名前に保存するために使用されているため、削除すると問題が発生します。回避策はありますか?私はあまり上手ではないので、どうすればいいのかわかりません。

4

1 に答える 1

1

ここで2つの選択肢:

(クイック&ダーティ)setup()の場合、最初のを次のように変更できます。

if name != "":
    self.nameEntry.grid_forget()
    self.setupBtn.config(text="Roll Again")

grid_forget()により、Tkはウィジェットを削除しますが、実際には破棄しません。また、ボタンを再作成する必要はありません。テキストを変更するようにボタンに指示するだけです。これを行う別の方法は、self.name = Noneを設定し__init__、setup()を次のように変更することです。

def __init__(self):
    self.name=None
    # rest of __init__ the same

def setup(self):
    if not self.name:
        self.name = self.nameEntry.get()
        self.nameEntry.destroy()
        self.setupBtn.config(text="Roll Again")

    randomNumber = randrange(10, 100)
    if not self.name:
        message = "Your name please!"
        self.preText.delete(0.0, END)
        self.preText.insert(0.0, message)
    else:
        self.preText.delete(0.0, END)
        self.preText.insert(0.0, str(randomNumber))

残念ながら、Tkinter / ttkの優れた中心的な情報源は1つも見つかりませんでしたが、見つけたものは次のとおりです。

可能な限りttkウィジェットを使用すると、アプリがネイティブホストアプリのように見えます。Tixに関しては、主に下位互換性のためにあります。

于 2012-05-02T18:51:55.553 に答える