2015-11-08 2 views
1

Это мой код:Почему вызов entry.get() дает мне «недопустимое имя команды»?

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() 

И когда я вызываю код:

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

я получаю:

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" 

Я использую Python 3.4.3 на 32-битных ОС Windows 7.

ответ

3

Когда вы нажимаете кнопку, приложение уничтожается, mainloop завершает работу, и вы пытаетесь вернуть содержимое виджета Entry ... в приложении, которое было уничтожено. Перед уничтожением приложения необходимо сохранить содержимое entry. Вместо того, чтобы взломать ваш путь через это, было бы гораздо лучше настроить приложение Tkinter надлежащим образом, например, с объектно-ориентированным подходом.

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() 
Смежные вопросы