Python: 删除TKinter框架

10 投票
5 回答
88051 浏览
提问于 2025-04-16 05:41

我想在点击某个特定按钮时,从我的界面上移除一个框架。

这是被调用的回调函数

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() 来彻底删除它;如果你想以后再用,可以保留这个框架的引用,等需要的时候再用“打包”或“网格”把它显示出来。

撰写回答