Python: 删除TKinter框架
我想在点击某个特定按钮时,从我的界面上移除一个框架。
这是被调用的回调函数
def removeMyself(self):
del self
但是,它并没有自己消失。我可能只是把Python中的对象删除了,但没有更新界面?
谢谢
更新
self.itemFrame = tk.Frame(parent)
self.itemFrame.pack(expand=False, side=tk.TOP)
removeB = tk.Button(self.itemFrame, text="Remove", width=10, command=self.removeIsosurface)
def removeIsosurface(self):
self.itemFrame.Destroy()
错误信息:
AttributeError: Frame instance has no attribute 'Destroy'
5 个回答
1
假设你正在创建一个类。在这里你需要做几件特别的事情:
- 你想要销毁的框架(frame)必须是一个实例变量,也就是说它是这个类的一部分。
- 你需要写一个回调函数(你已经做到了)。
那么,下面就是一个基本的原型示例。
from Tkinter import Tk, Frame, Button, Label
class GUI:
def __init__(self, root):
self.root = root # root is a passed Tk object
self.button = Button(self.root, text="Push me", command=self.removethis)
self.button.pack()
self.frame = Frame(self.root)
self.frame.pack()
self.label = Label(self.frame, text="I'll be destroyed soon!")
self.label.pack()
def removethis(self):
self.frame.destroy()
root = Tk()
window = GUI(root)
root.mainloop()
祝你好运!
2
del
并不是用来删除东西的。 当你写 del something
的时候,它只是把 something
从当前的作用域中移除。虽然如果 something
是指向某个对象的唯一引用,这样做可能会让这个对象在将来被垃圾回收,但千万不要指望用 del
来真正删除对象!而且,因为 self
只是一个普通的变量,所以 del self
其实什么也不做,当然,这样做会阻止方法的其他部分访问这个实例(所以在方法结束时,它实际上就像是 pass
一样)。
从图形用户界面(GUI)中移除一个小部件的具体方法取决于你使用的布局管理器。如果你使用了 .grid()
,那么可以用 .grid_forget()
。需要注意的是,这样做并不会销毁这个小部件——实际上,你可以继续使用 .grid()
再次显示它!——但这并没有什么区别。
24
要移除一个框架,可以使用 frm.pack_forget()
或者 frm.grid_forget()
,具体用哪个取决于你是用“打包”还是“网格”来放置这个框架的。
如果你不打算再使用这个框架,就可以调用 frm.destroy()
来彻底删除它;如果你想以后再用,可以保留这个框架的引用,等需要的时候再用“打包”或“网格”把它显示出来。