我试图创建一个在屏幕上创建并放置按钮的功能(带网格),按钮的命令将自行删除(或任何其他小部件),但我没有这样做。
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对象没有属性破坏”
我该如何正确地做到这一点?
答案 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
。
如果要保留对窗口小部件的引用,则需要将窗口小部件创建与窗口小部件布局分开。这是一个很好的习惯,因为这些在概念上是两个不同的东西。根据我的经验,布局在开发过程中可能会发生很大变化,但我使用的小部件并没有那么大的改变。将它们分开可以使开发更容易。此外,如果您决定提供多种布局(例如:左侧导航,右侧导航等),它将为以后打开大门。