Python: удаление рамки TKinter - PullRequest
       16

Python: удаление рамки TKinter

3 голосов
/ 18 октября 2010

Я хочу удалить рамку из моего интерфейса при нажатии определенной кнопки.

Это вызванная функция обратного вызова

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'

Ответы [ 4 ]

14 голосов
/ 18 октября 2010

Чтобы удалить, позвоните либо frm.pack_forget(), либо frm.grid_forget() в зависимости от того, был ли кадр упакован или заполнен сеткой.

Затем позвоните frm.destroy(), если вы не собираетесь использовать его снова, или удерживайте ссылку и перепакуйте или перепечатайте, когда вы захотите показать ее снова.

2 голосов
/ 18 октября 2010

del ничего не удаляет. del something просто удаляет something из локальной области видимости.И хотя если something была единственной ссылкой на объект, то может позволить объекту, который он будет собирать в будущем, даже не думайте об использовании del для удаления объектов !!!А поскольку self - это просто обычные переменные, del self ничего не делает, за исключением, конечно, прекращения доступа к экземпляру остальной части метода (так что в конце метода это фактически похоже на pass).

Точный способ удаления виджета из графического интерфейса зависит от того, какой менеджер геометрии вы используете.Если вы использовали .grid(), вы можете использовать .grid_forget().Обратите внимание, что это по-прежнему не разрушает виджет - наоборот, вы можете продолжить и .grid() снова!- но это не имеет никакого значения.

0 голосов
/ 18 октября 2010

Допустим, вы делаете класс. Вы должны сделать несколько вещей здесь:

  • Кадр, который вы хотите уничтожить, должен быть переменной экземпляра
  • Вы должны написать обратный вызов (что вы сделали)

Итак, вот как будет выглядеть базовый прототип.

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

Удачной охоты!

0 голосов
/ 18 октября 2010

это не поможет: self.destroy()

проверьте это: PY поваренная книга последний пункт

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...