Tkinter:如何在不导致错误的情况下删除输入字段?

时间:2012-05-02 15:20:35

标签: tkinter python-2.7

我试图在用户提供他/她的名字后删除一个Entry字段,但是,使用此代码我收到错误:

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()用于存储到名称中,因此,当我删除它时,它会导致问题。你有解决方法吗?我不是很好,因此不确定如何继续。

1 个答案:

答案 0 :(得分:1)

这里有两个选择:

(快速和肮脏)您可以将setup()中的第一个更改为:

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

grid_forget()会导致Tk删除小部件,但实际上并未将其销毁。此外,您无需重新创建按钮,只需告诉它更改其文本即可。另一种方法是在__init__中设置self.name = None并将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找到一个好的中心信息来源,但这里是我找到的:

尽可能使用ttk小部件,它们使您的应用看起来更像本机主机应用。至于Tix,主要是为了向后兼容。