2010-09-29 13 views
25

Qualcosa del genere, farebbe il widget di apparire normalmente:In Tkinter esiste un modo per rendere un widget non visibile?

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

Mentre qualcosa di simile, renderebbe il widget non appare affatto:

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

Qual è la domanda, non dovrebbe essere il comportamento appropriato? – pyfunc

+0

@pyfunc La domanda è nell'argomento (indipendentemente dal fatto che sia bello essere lì ma non nel corpo del messaggio). – Shule

risposta

38

Potete essere interessato dal pack_forget e grid_forget metodi di un widget. Nel seguente esempio, il pulsante scompare quando si fa 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' è un'altra opzione. Il vantaggio su 'grid_forget' è che la griglia ricorderà tutte le opzioni, quindi un semplice' grid() 'lo rimetterà a posto. Non c'è 'pack_remove'. –

+0

@BryanOakley: [Qui] (http://effbot.org/tkinterbook/pack.htm#Tkinter.Pack.pack_forget-method) dice che anche 'pack()' lo ricorda pure. – Gogo

+1

@shaktimaan: Non vedo dove si dice che le opzioni siano ricordate. Può essere visualizzato di nuovo, ma potrebbe non essere visualizzato nello stesso punto. –

23

Una possibilità, come spiegato in un'altra risposta, è quello di utilizzare pack_forget o grid_forget. Un'altra opzione è utilizzare lift e lower. Questo cambia l'ordine di sovrapposizione dei widget. L'effetto netto è che puoi nascondere i widget dietro i widget di pari livello (o i discendenti dei fratelli). Quando vuoi che siano visibili tu, lift, e quando vuoi che siano invisibili, le tue lower.

Il vantaggio (o lo svantaggio ...) è che occupano ancora spazio nel loro master. Se "dimentichi" un widget, gli altri widget potrebbero modificarne la dimensione o l'orientamento, ma se li alzi o li abbassi non lo faranno.

Ecco un semplice esempio:

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

Potrei sbagliarmi, ma non penso che funzioni in Python/Tkinter. Indovinando dal tuo uso di 'raise()', che è una parola riservata Python (in realtà si chiama 'lift()'), non penso tu usi Python/Tkinter. – AndyL

+5

@AndyL: Io uso tkinter un bel po 'di questi giorni (circa 2011) e ho circa 15 anni di esperienza con tk che si traduce piacevolmente. Francamente, penso che tu abbia torto su questa soluzione che non funziona, ma mi piacerebbe sentire i tuoi ragionamenti. Perché dici che non pensi che funzioni? Sai di un caso in cui è così, o stai indovinando? Grazie, a proposito, per il promemoria su sollevare contro rilancio. A volte mi dimentico che tkinter deve allontanarsi dalla api nativa di tk per adattarsi alla sintassi di python e sollevare è un comando che raramente ho bisogno di usare. Ho aggiornato la mia risposta. –

+4

Dopo aver riletto il mio commento, vorrei dire che sicuramente non volevo essere così offensivo come suonavo. Mie scuse. Ho fatto il mio commento iniziale perché ho provato la tua soluzione prima e non riuscivo a farlo funzionare per me. Ho ottenuto un TclError ogni volta che ho provato ad abbassare un widget dietro il suo genitore. Questo potrebbe in teoria essere un errore da parte mia. Potresti fornire il codice per illuminarmi? – AndyL

3

So che questo è un paio di anni di ritardo, ma questa è la risposta di Google 3 ° ora "Tkinter nascondere Label" al 10/27/13 .. Quindi, se qualcuno come me qualche settimana fa sta costruendo una semplice GUI e vuole solo che un testo appaia senza doverlo scambiare per un altro widget con i metodi "lower" o "lift", mi piacerebbe offrire una soluzione che 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() 

l'idea qui è che si può impostare il colore del testo DISABILI th e background ('bg') del genitore usando ".cget ('bg')" http://effbot.org/tkinterbook/widget.htm rendendolo "invisibile". Il pulsante callback reimposta l'etichetta sul colore di primo piano predefinito e il testo è nuovamente visibile.

Gli svantaggi qui sono che devi ancora allocare lo spazio per il testo anche se non puoi leggerlo, e almeno sul mio computer, il testo non si fonde perfettamente con lo sfondo. Forse con alcuni aggiustamenti la cosa a colori potrebbe essere migliore e per le GUI compatte, l'allocazione dello spazio vuoto non dovrebbe essere troppo complicata per una breve descrizione.

Vedere Default window colour Tkinter and hex colour codes per le informazioni su come ho scoperto le cose a colori.

Problemi correlati