【问题标题】:Tkinter .destroy() button causes error when in functionTkinter .destroy() 按钮在功能中会导致错误
【发布时间】:2014-12-03 21:16:56
【问题描述】:

我的 Tkinter 窗口中有一个按钮,单击该按钮时需要调用两个函数:.get() 用于存储输入框值,.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"

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

【问题讨论】:

    标签: python button tkinter destroy


    【解决方案1】:

    问题不在于destroy 方法。相反,Python 抱怨它找不到selfframe 属性。这是因为您忘记在GuardianLocator.__init__ 中实际使frame 成为实例属性:

    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
    

    【讨论】:

      【解决方案2】:

      更改此代码:

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

      【讨论】:

      • 你在哪里调用你的guardian_name函数?
      • 仅在按钮内部-self.button1 = Button(self.frame, text="Search", command=self.guardian_name, pady=2)
      • 该窗口在另一个文件中被调用:root = Tk() locator = guardian_locator.GuardianLocator(root) root.mainloop()
      • 看看 iCodez 对他的回答的编辑,应该可以解决你的问题。
      猜你喜欢
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 2015-10-25
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多