我的Tkinter窗口中有一个按钮,点击后需要调用两个函数:.get()
存储输入框值和.destroy()
,以便按下按钮时窗口关闭。
我必须做错事,因为我是将.destroy()
放在我的分组函数中.get()
还是将.destroy()
作为按钮中的唯一命令,我收到此错误:< / p>
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"
它似乎是指.get()调用,但在我进行self.frame更改之前,它工作正常。有谁知道那个错误意味着什么?
答案 0 :(得分:2)
问题不在于destroy
方法。相反,Python抱怨它无法找到frame
的{{1}}属性。这是因为您忘记在self
中实际设置frame
实例属性:
GuardianLocator.__init__
请注意每次使用名称self.frame = Frame(master)
self.frame.grid()
之前放置的self.
。
如果不这样做,名称frame
就是frame
方法的本地名称,因此__init__
通过guardian_name
无法访问。
修改强>
当你这样做时:
self
self.frame.destroy()
引用的Frame
对象已被销毁,不再可用。此外,self.frame
引用的Entry
对象同样被破坏,因为它是框架的子代。这意味着您无法做到:
self.entry
因为此时return self.entry.get()
不再存在。
要避免此问题,您应该返回self.entry
,等于self._name
:
self.entry.get()
答案 1 :(得分: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")