2

我试图创建一个函数,在屏幕上创建和放置一个按钮(带网格),并且按钮的命令将删除自身(或任何其他小部件),但我没有这样做。

def a(self):
    self.call_button = Tkinter.Button(self.root, text = "Call", command=self.b).grid(row = 5, column = 5)

def b(self):
    self.call_button.destroy()

a 创建按钮并 b 删除它,但是当我调用 b 时,它说“NoneType 对象没有属性破坏”

我该如何正确地做到这一点?

4

2 回答 2

6

self.call_button设置为结果grid(row=5, column=5)而不是按钮..

from tkinter import *
class App(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.grid()
        self.a()

    def a(self):
        self.call_button = Button(self, text = "Call", command=self.b)
        self.call_button.grid(row=5, column=5) # This is fixing your issue

    def b(self):
        self.call_button.destroy()

root = Tk()
app = App(master=root)
app.mainloop()
于 2013-07-16T10:33:26.510 回答
1

在 python 中,如果你这样做foo=a().b(),则 foo 被赋予b(). 因此,当您这样做时self.call_button = Button(...).grid(...),self.call_button 的值将.grid(...)始终为None

如果要保留对小部件的引用,则需要将小部件创建与小部件布局分开。这是一个养成的好习惯,因为无论如何这在概念上是两个不同的东西。根据我的经验,布局在开发过程中会发生很大变化,但我使用的小部件不会发生太大变化。将它们分开使开发更容易。另外,如果您决定提供多种布局(例如:左侧导航、右侧导航等),它会为以后打开大门。

于 2013-07-16T10:41:52.257 回答