web-dev-qa-db-fra.com

Dans Tkinter, y a-t-il un moyen de rendre un widget invisible? 

Quelque chose comme ceci, ferait apparaître le widget normalement:

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

Bien que quelque chose comme ceci, le widget n'apparaisse pas du tout:

Label(self, text = 'hello', visible ='no') 
28
rectangletangle

Vous pouvez être intéressé par les méthodes pack_forget et grid_forget d'un widget. Dans l'exemple suivant, le bouton disparaît lorsqu'on clique dessus.

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()
43
luc

Une option, comme expliqué dans une autre réponse, consiste à utiliser pack_forget ou grid_forget. Une autre option consiste à utiliser lift et lower. Cela change l'ordre d'empilement des widgets. L'effet net est que vous pouvez masquer les widgets derrière les widgets frères (ou les descendants des frères et sœurs). Lorsque vous souhaitez qu’ils soient visibles, vous les lift et lorsque vous souhaitez qu’ils soient invisibles, vous lower 

L'avantage (ou le désavantage ...) est qu'ils occupent toujours de la place dans leur maître. Si vous "oubliez" un widget, les autres widgets pourraient réajuster leur taille ou leur orientation, mais si vous les augmentez ou les abaissez, ils ne le feront pas. 

Voici un exemple simple:

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 __== "__main__":
    app = SampleApp()
    app.mainloop()
26
Bryan Oakley

Je sais que nous avons quelques années de retard, mais c’est la troisième réponse de Google pour "Tkinter hide Label" à partir du 27/10/2013 ... Donc, si quelqu'un comme moi, il y a quelques semaines, construit une interface graphique simple et juste souhaite que du texte apparaisse sans le remplacer par un autre widget via les méthodes "inférieure" ou "élévatrice", j'aimerais proposer une solution de contournement que j'utilise (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 __== '__main__':
    root=Tk()   
    ds = Top(root)
    root.mainloop()

L'idée ici est que vous pouvez définir la couleur du texte DISABLED sur l'arrière-plan ("bg") du parent à l'aide de ".cget (" bg ")" http://effbot.org/tkinterbook/widget.htm le rendant "invisible". Le rappel de bouton réinitialise l'étiquette sur la couleur de premier plan par défaut et le texte est à nouveau visible. 

Les inconvénients ici sont que vous devez toujours allouer de l'espace pour le texte même si vous ne pouvez pas le lire, et au moins sur mon ordinateur, le texte ne se fond pas parfaitement à l'arrière-plan. Peut-être qu'avec des ajustements, la couleur pourrait être meilleure et pour les interfaces graphiques compactes, l'allocation d'espace vide ne devrait pas être trop compliquée pour un court texte de présentation.

Voir Couleur de la fenêtre par défaut Tkinter et les codes de couleur hexadécimale pour plus d’informations sur la façon dont j’ai découvert la couleur.

4
WellThatBrokeIt

Pour quelqu'un qui déteste OOP comme moi

import tkinter as tk

def show_label():
    label1.lift()

def hide_label():
    label1.lower()

root = tk.Tk()
frame1 = tk.Frame(root)
frame1.pack()

label1 = tk.Label(root, text="Hello, world")
label1.pack(in_=frame1)

button1 = tk.Button(root, text="Click to hide label",command=hide_label)
button2 = tk.Button(root, text="Click to show label", command=show_label)
button1.pack(in_=frame1)
button2.pack(in_=frame1)

root.mainloop()
0
bemygon