webentwicklung-frage-antwort-db.com.de

Gibt es in Tkinter eine Möglichkeit, ein Widget nicht sichtbar zu machen? 

So etwas würde das Widget normal erscheinen lassen:

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

So etwas würde das Widget überhaupt nicht erscheinen lassen:

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

Möglicherweise interessieren Sie die Methoden pack_forget und grid_forget eines Widgets. Im folgenden Beispiel verschwindet die Schaltfläche, wenn Sie darauf klicken

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

Wie in einer anderen Antwort erläutert, können Sie pack_forget oder grid_forget verwenden. Eine andere Option ist die Verwendung von lift und lower. Dies ändert die Stapelreihenfolge der Widgets. Der Nettoeffekt ist, dass Sie Widgets hinter Geschwister-Widgets (oder Nachkommen von Geschwistern) ausblenden können. Wenn Sie möchten, dass sie sichtbar sind, lift, und wenn Sie möchten, dass sie unsichtbar sind, lower

Der Vorteil (oder Nachteil ...) besteht darin, dass sie in ihrem Master noch Platz beanspruchen. Wenn Sie ein Widget "vergessen", passen die anderen Widgets möglicherweise ihre Größe oder Ausrichtung neu an. 

Hier ist ein einfaches Beispiel:

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

Ich weiß, dass dies ein paar Jahre zu spät ist, aber dies ist jetzt die dritte Google-Antwort für "Tkinter hide Label" vom 27.10.13 ... Also, wenn jemand wie ich vor ein paar Wochen eine einfache GUI baut und einfach möchte, dass ein Text angezeigt wird, ohne ihn durch "lower" oder "lift" -Methoden gegen ein anderes Widget auszutauschen, ich möchte eine von mir verwendete Problemumgehung anbieten (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()

Die Idee dabei ist, dass Sie die Farbe des DISABLED-Texts mit ".cget (" bg ")" http://effbot.org/tkinterbook/widget.htm auf den Hintergrund ('bg') des übergeordneten Elements setzen können macht es "unsichtbar". Der Button Callback setzt die Beschriftung auf die Standard-Vordergrundfarbe zurück und der Text ist wieder sichtbar. 

Ein Nachteil ist, dass Sie immer noch den Platz für den Text zuweisen müssen, auch wenn Sie ihn nicht lesen können, und zumindest auf meinem Computer fügt sich der Text nicht perfekt in den Hintergrund ein. Bei einigen Optimierungen könnte die Farbe etwas besser sein, und bei kompakten GUIs sollte die Zuordnung von Leerzeichen nicht zu viel Aufwand für ein kurzes Aufklappen sein.

Siehe Standardfensterfarbe Tkinter und Hex-Farbcodes für Informationen darüber, wie ich etwas über das Farbzeug herausgefunden habe.

4
WellThatBrokeIt

Zum Ausblenden eines Widgets können Sie die Funktion pack_forget () verwenden. Zum erneuten Anzeigen können Sie die Funktion pack () verwenden und beide Funktionen in separaten Funktionen implementieren.

from Tkinter import *
root = Tk()
label=Label(root,text="I was Hidden")
def labelactive():
    label.pack()
def labeldeactive():
    label.pack_forget()
Button(root,text="Show",command=labelactive).pack()
Button(root,text="Hide",command=labeldeactive).pack()
root.mainloop()
1
Saheb Singh

Für jemanden, der OOP wie mich hasst (Dies basiert auf der Antwort von Bryan Oakley)

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