2014-12-03 84 views
0

我有我的Tkinter窗口中的按钮,单击该按钮时,需要调用两个功能:一个.get()存储输入框值和.destroy()所以窗口关闭按钮时被按下。Tkinter的.destroy()按钮会导致错误时,在功能

我必须做一些错误的,因为我是否把.destroy()在我的分组功能与.get()或将.destroy()类似按钮的唯一命令,我得到这个错误:

AttributeError: 'GuardianLocator' object has no attribute 'frame' 

我相信我的代码是几乎相同,以在这个网站,所以我不知道为什么.destroy()不工作的其他答案...

from tkinter import * 


class GuardianLocator: 

    def __init__(self, master): 
     self._name = "" 
     frame = Frame(master) 
     frame.grid() 
     master.title("GUARDIAN LOCATOR") 

     self.locator_label = Label(frame, text="Which Sailor Guardian are you looking for?", width=40, height=2) 
     self.locator_label.grid() 

     self.entry = Entry(frame) 
     self.entry.grid() 

     self.button1 = Button(frame, text="Search", command=self.guardian_name, pady=2) 
     self.button1.grid() 


    def guardian_name(self): 
     self._name = self.entry.get() 
     self.frame.destroy() 
     return self.entry.get() 

编辑

当我做从答案,self.frame推荐的变化,程序运行,但是当我点击按钮,我得到这个错误 -

Traceback (most recent call last): 
    File "C:\Python34\lib\tkinter\__init__.py", line 1482, in __call__ 
    return self.func(*args) 
    File "C:\Users\david\PycharmProjects\Sailor Moon Hunt\guardian_locator.py", line 25, in guardian_name 
    return self.entry.get() 
    File "C:\Python34\lib\tkinter\__init__.py", line 2484, in get 
    return self.tk.call(self._w, 'get') 
_tkinter.TclError: invalid command name ".45213328.45795632" 

这似乎是指获得( )调用,但是在我进行self.frame更改之前,它工作正常。有谁知道那个错误是什么意思?

回答

0

改变这样的代码:

def __init__(self, master): 
    self._name = "" 
    frame = Frame(master) 
    frame.grid() 
    master.title("GUARDIAN LOCATOR") 

下列要求:

def __init__(self, master): 
    self._name = "" 
    self.frame = Frame(master) 
    self.frame.grid() 
    master.title("GUARDIAN LOCATOR") 
+0

你在哪里调用你的'guardian_name'函数? – 2014-12-03 22:09:18

+0

只在按钮内部 'self.button1 = Button(self.frame,text =“Search”,command = self.guardian_name,pady = 2)' – djohnson129 2014-12-03 22:21:53

+0

该窗口正在另一个文件中调用: 'root = Tk() locator = guardian_locator.GuardianLocator(root) root.mainloop()' – djohnson129 2014-12-03 22:24:04

2

问题不在于destroy方法。相反,Python抱怨说它找不到selfframe属性。这是因为你忘了实际上使frame实例内GuardianLocator.__init__属性:

self.frame = Frame(master) 
self.frame.grid() 

通知的self.放置在每个使用名称frame之前。

没有这样做,名字frame是本地__init__方法,并通过selfguardian_name因此无法访问。


编辑:

当你这样做:

self.frame.destroy() 

self.frame引用的Frame对象被破坏,变得不再可用。而且,由self.entry引用的Entry对象同样被销毁,因为它是框架的子代。这意味着,你不能做:

return self.entry.get() 

因为self.entry不再在这一点上存在。

为了避免这个问题,你应该返回self._name,相当于self.entry.get()

return self._name 
相关问题