¿Cómo eliminar widgets Tkinter desde una ventana?

Tengo una lista de widgets de Tkinter que quiero cambiar dinámicamente.

¿Cómo puedo eliminar completamente los widgets de mi ventana?

Puede llamar a pack_forget para eliminar un widget (si usa el pack para agregarlo a la ventana).

Ejemplo:

 from tkinter import * root = Tk() b = Button(root, text="Delete me", command=lambda: b.pack_forget()) b.pack() root.mainloop() 

Si usa pack_forget , puede volver a mostrar el widget llamando al pack nuevamente. Si desea eliminarlo permanentemente, llame a destroy en el widget (entonces no podrá volver a agregarlo).

Si usa el método de grid , puede usar grid_forget o grid_remove para ocultar el widget.

Una forma de hacerlo es obtener la lista de esclavos del marco que debe borrarse y destruirlos u “esconderlos” según sus necesidades. Para obtener un marco claro puedes hacerlo así:

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

Debería llamar a grid_slaves() , pack_slaves() o slaves() dependiendo del método que utilizó para agregar el widget al marco.

Puedes usar el método de olvidar en el widget

 desde tkinter import *

 raíz = Tk ()

 Botón b = (raíz, texto = "Borrarme", comando = b.forget)
 b.pack ()

 root.mainloop ()

Descubrí que cuando el widget forma parte de una función y grid_remove forma parte de otra función, no elimina la etiqueta. En este ejemplo…

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

… no hay una forma válida de quitar la etiqueta.

La única solución que pude encontrar es darle un nombre a la etiqueta y hacerla global:

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

Cuando me encontré con este problema, había una clase involucrada, una función estaba en la clase y otra no, así que no estoy seguro de que las líneas de global label sean realmente necesarias en lo anterior.

Hoy aprendí un manejo sencillo y bueno de eventos de clics usando la biblioteca tkinter gui en python3, que me gustaría compartir dentro de este hilo.

 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)) == "": # 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("", MsgClick) msg.bind("", 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("", ButtonClick) button.bind("", ButtonDoubleClick) root.mainloop() 

Espero que ayude a alguien …