2012-09-11 1036 views

Respuesta

42

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.

+6

@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. –

+3

Si 'pack_forget' a Frame y luego lo borro, ¿eliminará los widgets secundarios también, o debería eliminarlos individualmente? – Marco83

+0

¿Puedes hacer algo así como 'place_forget' para place en lugar de pack? – Stegosaurus

-1

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.

+1

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. –

6

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.

0

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 ...

+0

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. –

+0

gracias @BryanOakley por motivarme para python3. :RE – ArifMustafa

Cuestiones relacionadas