Tkinter .destroy()按钮在运行时会导致错误

时间:2014-12-03 21:16:57

标签: python button tkinter destroy

我的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更改之前,它工作正常。有谁知道那个错误意味着什么?

2 个答案:

答案 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")