Solución:
https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/universal.html
w.winfo_children ()
Devuelve una lista de todos los hijos de w, en su orden de apilamiento de menor (inferior) a mayor (superior).
for widget in frame.winfo_children():
widget.destroy()
Destruirá todo el widget en tu marco. No es necesario un segundo fotograma.
pack_forget
y grid_forget
solo eliminará los widgets de la vista, no los destruirá. Si no planea reutilizar los widgets, su única opción real es destruirlos con el destroy
método.
Para hacer eso, tiene dos opciones: destruir cada uno individualmente o destruir el marco, lo que hará que todos sus hijos sean destruidos. Este último es generalmente el más fácil y efectivo.
Dado que afirma que no desea destruir el marco del contenedor, cree un marco secundario. Haga que este marco secundario sea el contenedor de todos los widgets que desea eliminar, y luego coloque este marco dentro del padre que lo hace no quiero destruir. Entonces, solo es cuestión de destruir este marco y todos los widgets interiores se destruirán junto con él.
Para un marco claro, primero debe destruir todos los widgets dentro del marco. Limpiará el marco.
import tkinter as tk
from tkinter import *
root = tk.Tk()
frame = Frame(root)
frame.pack(side="top", expand=True, fill="both")
lab = Label(frame, text="hiiii")
lab.grid(row=0, column=0, padx=10, pady=5)
def clearFrame():
# destroy all widgets from frame
for widget in frame.winfo_children():
widget.destroy()
# this will clear frame and frame will be empty
# if you want to hide the empty panel then
frame.pack_forget()
frame.but = Button(frame, text="clear frame", command=clearFrame)
frame.but.grid(row=0, column=1, padx=10, pady=5)
# then whenever you add data in frame then you can show that frame
lab2 = Label(frame, text="hiiii")
lab2.grid(row=1, column=0, padx=10, pady=5)
frame.pack()
root.mainloop()