Tengo una lista de widgets de Tkinter que quiero cambiar dinámicamente.Cómo eliminar widgets de Tkinter de una ventana?
¿Cómo puedo eliminar por completo los widgets de mi ventana?
Tengo una lista de widgets de Tkinter que quiero cambiar dinámicamente.Cómo eliminar widgets de Tkinter de una ventana?
¿Cómo puedo eliminar por completo los widgets de mi ventana?
Puede llamar al pack_forget
para eliminar un widget (si usa 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 utiliza pack_forget
, posteriormente puede mostrar el widget de nuevo llamando pack
nuevo. Si desea eliminarlo permanentemente, llame al destroy
en el widget (entonces no podrá volver a agregarlo).
Si se utiliza el método grid
, puede utilizar grid_forget
o grid_remove
-ocultar el widget.
Encontré que cuando el widget es parte de una función y el grid_remove
es 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 manera válida de la eliminación de la etiqueta.
La única solución que pude encontrar es dar a la etiqueta un nombre y hacer que sea mundial:
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 involucrado, una función de estar en la clase y no una , así que no estoy seguro de que las líneas global label
sean realmente necesarias en lo anterior.
El hecho de que no hay forma de eliminar la primera etiqueta que crea no está relacionado con el hecho de que lo está creando en una función y quitándolo en otra, simplemente es que está fallando aferrarse a una referencia. Esta no es una cuestión de tkinter, es algo de programación: para actuar sobre un objeto, debe tener una referencia al objeto. En su segundo ejemplo, no necesita usar una variable global. En su lugar, asígnelo a 'self' tal como lo hace con el widget de entrada. –
Una forma de hacerlo, es obtener la lista de esclavos del marco que debe limpiarse y destruirlos o "ocultarlos" según sus necesidades. Para conseguir un marco claro se puede hacerlo de esta manera:
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()
Debe llamar grid_slaves()
, pack_slaves()
o slaves()
dependiendo del método que utilizó para agregar el widget a la estructura.
Hoy aprendo algunos sencillos y buenos manejos de manejo de eventos 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)) == "<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()
esperan que ayude a alguien ...
se supone que esto es una respuesta a la pregunta? Si no, elimínelo. Si es así, debe aclarar cómo se relaciona con la eliminación de un widget. –
gracias @BryanOakley por motivarme para python3. :RE – ArifMustafa
@TheBeardedBerry: tenga en cuenta que 'pack_forget' no se eliminan los widgets, sólo los elimina de la vista. Seguirán existiendo, lo que podría causar una pérdida de memoria si continúa recreando widgets sin destruirlos. –
Si 'pack_forget' a Frame y luego lo borro, ¿eliminará los widgets secundarios también, o debería eliminarlos individualmente? – Marco83
¿Puedes hacer algo así como 'place_forget' para place en lugar de pack? – Stegosaurus