3

This is my code:

def ask(what,why):
    root=Tk()
    root.title(why)
    label=Label(root,text=what)
    label.pack()
    entry=Entry(root)
    entry.pack()
    button=Button(root,text='OK',command=root.destroy)
    button.pack()
    root.mainloop()
    return entry.get()

And when I call the code:

print(ask('Name:','Hello!'))

I get:

Traceback (most recent call last):
  File "C:\gui.py", line 16, in <module>
    ask('Name:','Hello!')
  File "C:\gui.py", line 15, in ask
    return entry.get()
  File "C:\Python34\lib\tkinter\__init__.py", line 2520, in get
    return self.tk.call(self._w, 'get')
_tkinter.TclError: invalid command name ".48148176"

I am using Python 3.4.3 on 32-bit Windows 7.

Cœur
  • 37,241
  • 25
  • 195
  • 267
Onken Guy
  • 101
  • 1
  • 2

1 Answers1

6

When you press the button, the application is destroyed, the mainloop ends, and you try to return the contents of an Entry widget... in an application that was destroyed. You need to save the contents of entry before destroying the application. Instead of hacking your way through this, it would be much better to set up a Tkinter application in the proper way, such as with an object-oriented approach.

class App:
    # 'what' and 'why' should probably be fetched in a different way, suitable to the app
    def __init__(self, parent, what, why):
        self.parent = parent
        self.parent.title(why)
        self.label = Label(self.parent, text=what)
        self.label.pack()
        self.entry = Entry(self.parent)
        self.entry.pack()
        self.button = Button(parent, text='OK', command=self.use_entry)
        self.button.pack()
    def use_entry(self):
        contents = self.entry.get()
        # do stuff with contents
        self.parent.destroy() # if you must

root = Tk()
app = App(root, what, why)
root.mainloop()
TigerhawkT3
  • 48,464
  • 6
  • 60
  • 97