2010-09-29 64 views
25

Algo como esto, haría que el widget aparece normalmente:En Tkinter, ¿hay alguna forma de hacer que un widget no sea visible?

Label(self, text = 'hello', visible ='yes') 

Mientras que algo como esto, haría que el widget no aparece en absoluto:

Label(self, text = 'hello', visible ='no') 
+0

¿Cuál es la pregunta, ¿no debería ser ese el comportamiento apropiado? – pyfunc

+0

@pyfunc La pregunta está en el tema (si es bueno o no estar allí, pero no en el cuerpo del mensaje). – Shule

Respuesta

38

Usted puede estar interesado por el pack_forget y grid_forget métodos de un widget. En el siguiente ejemplo, el botón desaparece cuando se hace clic

from Tkinter import * 

def hide_me(event): 
    event.widget.pack_forget() 

root = Tk() 
btn=Button(root, text="Click") 
btn.bind('<Button-1>', hide_me) 
btn.pack() 
btn2=Button(root, text="Click too") 
btn2.bind('<Button-1>', hide_me) 
btn2.pack() 
root.mainloop() 
+22

'grid_remove' es otra opción. La ventaja de 'grid_forget' es que la grilla recordará todas las opciones, de modo que una simple' grid() 'lo regresará. No hay 'pack_remove'. –

+0

@BryanOakley: [Aquí] (http://effbot.org/tkinterbook/pack.htm#Tkinter.Pack.pack_forget-method) dice que incluso 'pack()' lo recuerda también. – Gogo

+1

@shaktimaan: No veo dónde dice que se recuerden las opciones. Se puede volver a mostrar, pero es posible que no se vuelva a mostrar en el mismo lugar. –

23

Una opción, tal como se explica en otra respuesta, es utilizar pack_forget o grid_forget. Otra opción es usar lift y lower. Esto cambia el orden de apilamiento de los widgets. El efecto neto es que puede ocultar widgets detrás de widgets hermanos (o descendientes de hermanos). Cuando desee que sean visibles, lift, y cuando desee que sean invisibles, lower.

La ventaja (o desventaja ...) es que todavía ocupan espacio en su maestro. Si "olvida" un widget, los otros widgets pueden reajustar su tamaño u orientación, pero si los sube o los baja no lo harán.

Aquí está un ejemplo sencillo:

import Tkinter as tk 

class SampleApp(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     self.frame = tk.Frame(self) 
     self.frame.pack(side="top", fill="both", expand=True) 
     self.label = tk.Label(self, text="Hello, world") 
     button1 = tk.Button(self, text="Click to hide label", 
          command=self.hide_label) 
     button2 = tk.Button(self, text="Click to show label", 
          command=self.show_label) 
     self.label.pack(in_=self.frame) 
     button1.pack(in_=self.frame) 
     button2.pack(in_=self.frame) 

    def show_label(self, event=None): 
     self.label.lift(self.frame) 

    def hide_label(self, event=None): 
     self.label.lower(self.frame) 

if __name__ == "__main__": 
    app = SampleApp() 
    app.mainloop() 
+2

Podría estar equivocado, pero no creo que esto funcione en Python/Tkinter. Adivinando por su uso de 'raise()', que es una palabra reservada de Python (en realidad se llama 'lift()'), no creo que use Python/Tkinter. – AndyL

+5

@AndyL: Uso tkinter bastante estos días (circa 2011) y tengo alrededor de 15 años de experiencia con tk que se traduce muy bien. Francamente, creo que te equivocas acerca de que esta solución no funciona, pero me encantaría escuchar tu razonamiento. ¿Por qué dices que no crees que funcione? ¿Conoces un caso donde esto es así o estás adivinando? Gracias, dicho sea de paso, por el recordatorio sobre levantar contra levantar. A veces olvido que tkinter tiene que alejarse de la API nativa de tk para acomodar la sintaxis de python, y levantar es un comando que rara vez necesito usar. He actualizado mi respuesta. –

+4

Después de volver a leer mi comentario, me gustaría decir que definitivamente no quise ser tan ofensivo como soné. Mis disculpas. Hice mi comentario inicial porque ya probé su solución y no pude lograr que funcionara. Recibí un TclError cada vez que traté de bajar un widget detrás de su padre. Esto podría ser un lapso de mi parte. ¿Podrías proporcionar código para iluminarme? – AndyL

3

Sé que esto es un par de años de retraso, pero esta es la tercera respuesta de Google ahora para "Tkinter Ocultar etiqueta" a partir del 10/27/13 .. Así que si alguien como yo hace unas semanas está construyendo una GUI simple y solo quiere que aparezca algo de texto sin cambiarlo por otro widget mediante métodos "más bajos" o "levantar", me gustaría ofrecer una solución alternativa que uso (Python2.7, Windows):

from Tkinter import * 


class Top(Toplevel): 
    def __init__(self, parent, title = "How to Cheat and Hide Text"): 
     Toplevel.__init__(self,parent) 
     parent.geometry("250x250+100+150") 
     if title: 
      self.title(title) 
     parent.withdraw() 
     self.parent = parent 
     self.result = None 
     dialog = Frame(self) 
     self.initial_focus = self.dialog(dialog) 
     dialog.pack() 


    def dialog(self,parent): 

     self.parent = parent 

     self.L1 = Label(parent,text = "Hello, World!",state = DISABLED, disabledforeground = parent.cget('bg')) 
     self.L1.pack() 

     self.B1 = Button(parent, text = "Are You Alive???", command = self.hello) 
     self.B1.pack() 

    def hello(self): 
     self.L1['state']="normal" 


if __name__ == '__main__': 
    root=Tk() 
    ds = Top(root) 
    root.mainloop() 

la idea aquí es que se puede establecer el color del texto DISABLED a th e background ('bg') del padre que usa ".cget ('bg')" http://effbot.org/tkinterbook/widget.htm que lo hace "invisible". La devolución de llamada del botón restablece la etiqueta al color de primer plano predeterminado y el texto vuelve a estar visible.

Las desventajas aquí son que todavía tiene que asignar el espacio para el texto aunque no pueda leerlo, y al menos en mi computadora, el texto no se mezcla perfectamente con el fondo. Tal vez con algunas modificaciones, el color podría ser mejor y, para las GUI compactas, la asignación del espacio en blanco no debería ser demasiado complicada para una breve propaganda.

Consulte Default window colour Tkinter and hex colour codes para obtener información acerca de cómo me enteré sobre el material de color.

Cuestiones relacionadas