Подтвердить что ты не робот

Как удалить виджеты Tkinter из окна?

У меня есть список виджетов Tkinter, которые я хочу изменить динамически.

Как я могу полностью удалить виджеты из моего окна?

4b9b3361

Ответ 1

Вы можете вызвать pack_forget, чтобы удалить виджет (если вы используете pack, чтобы добавить это к окну).

Пример:

from tkinter import *

root = Tk()

b = Button(root, text="Delete me", command=lambda: b.pack_forget())
b.pack()

root.mainloop()

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

Если вы используете метод grid, вы можете использовать grid_forget или grid_remove для скрытия виджета.

Ответ 2

Один из способов сделать это - получить список подчиненных из фрейма, который необходимо очистить, уничтожить или "спрятать" в соответствии с вашими потребностями. Чтобы получить четкую рамку, вы можете сделать это следующим образом:

from tkinter import *

root = Tk()

def clear():
    list = root.grid_slaves()
    for l in list:
        l.destroy()

Label(root,text='Hello World!').grid(row=0)
Button(root,text='Clear',command=clear).grid(row=1)

root.mainloop()

Вы должны вызвать grid_slaves(), pack_slaves() или slaves() в зависимости от метода, который вы использовали для добавления виджета в фрейм.

Ответ 3

Я обнаружил, что, когда виджет является частью функции, а grid_remove является частью другой функции, он не удаляет ярлык. В этом примере...

def somefunction(self):
    Label(self, text=" ").grid(row = 0, column = 0)
    self.text_ent = Entry(self)
    self.text_ent.grid(row = 1, column = 0)
def someotherfunction(self):
    somefunction.text_ent.grid_remove()

... не существует допустимого способа удаления метки.

Единственное решение, которое я смог найти, - дать ярлыку имя и сделать его глобальным:

def somefunction(self):
    global label
    label = Label(self, text=" ")
    label.grid(row = 0, column = 0)
    self.text_ent = Entry(self)
    self.text_ent.grid(row = 1, column = 0)
def someotherfunction(self):
    global label
    somefunction.text_ent.grid_remove()
    label.grid_remove()

Когда я столкнулся с этой проблемой, был задействован класс, одна функция была в классе, а другая нет, поэтому я не уверен, что строки global label действительно необходимы в приведенном выше.

Ответ 4

Сегодня я изучаю простую и эффективную обработку событий click, используя библиотеку tkinter gui в python3, которую я хотел бы поделиться внутри этого потока.

from tkinter import *

cnt = 0


def MsgClick(event):
    children = root.winfo_children()
    for child in children:
        # print("type of widget is : " + str(type(child)))
        if str(type(child)) == "<class 'tkinter.Message'>":
            # print("Here Message widget will destroy")
            child.destroy()
            return

def MsgMotion(event):
  print("Mouse position: (%s %s)" % (event.x, event.y))
  return


def ButtonClick(event):
    global cnt, msg
    cnt += 1
    msg = Message(root, text="you just clicked the button..." + str(cnt) + "...time...")
    msg.config(bg='lightgreen', font=('times', 24, 'italic'))
    msg.bind("<Button-1>", MsgClick)
    msg.bind("<Motion>", MsgMotion)
    msg.pack()
    #print(type(msg)) tkinter.Message


def ButtonDoubleClick(event):
    import sys; sys.exit()


root = Tk()

root.title("My First GUI App in Python")
root.minsize(width=300, height=300)
root.maxsize(width=400, height=350)
button = Button(
    root, text="Click Me!", width=40, height=3
)
button.pack()
button.bind("<Button-1>", ButtonClick)
button.bind("<Double-1>", ButtonDoubleClick)

root.mainloop()

Надеюсь, что это поможет кому-то...