Tkinter从正在运行的程序中删除按钮

时间:2013-07-16 10:05:06

标签: python user-interface widget tkinter destroy

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

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对象没有属性破坏”

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

在python中,如果你执行foo=a().b(),则foo的值为b()。因此,当您执行self.call_button = Button(...).grid(...)时,self.call_button的值为.grid(...),始终为None

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