Подтвердить что ты не робот

В Tkinter есть ли способ сделать виджет невидимым?

Что-то вроде этого, чтобы виджет выглядел нормально:

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

Пока что-то вроде этого, виджет не появится вообще:

Label(self, text = 'hello', visible ='no') 
4b9b3361

Ответ 1

Вас может заинтересовать pack_forget и grid_forget методов виджета. В следующем примере кнопка исчезает при нажатии

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

Ответ 2

Один из вариантов, как объясняется в другом ответе, заключается в использовании pack_forget или grid_forget. Другой вариант - использовать lift и lower. Это изменяет порядок укладки виджетов. Чистый эффект заключается в том, что вы можете скрывать виджеты за видными видениями сестры (или потомками братьев и сестер). Когда вы хотите, чтобы они были видны вами, lift их, и когда вы хотите, чтобы они были невидимыми, вы lower их.

Преимущество (или недостаток...) состоит в том, что они все еще занимают место у своего хозяина. Если вы "забудете" виджет, другие виджеты могут перенастроить их размер или ориентацию, но если вы их поднимете или опустите, они не будут.

Вот простой пример:

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

Ответ 3

Я знаю, что это на пару лет поздно, но это третий ответ Google для "Tkinter hide Label" от 10/27/13... Итак, если кто-то вроде меня несколько недель назад строит простой GUI и просто хочет, чтобы какой-то текст появлялся без замены его для другого виджета с помощью методов "ниже" или "поднять", я хотел бы предложить обходной путь, который я использую (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()

Идея здесь заключается в том, что вы можете установить цвет текста DISABLED в фоновом режиме ('bg') родителя, используя ".cget('bg')" http://effbot.org/tkinterbook/widget.htm, что делает его "невидимым". Обратный вызов кнопки сбрасывает метку на цвет переднего плана по умолчанию, и текст снова отображается.

Недостатки здесь в том, что вам все равно нужно выделить пространство для текста, даже если вы не можете его прочитать, и, по крайней мере, на моем компьютере текст не идеально сочетается с фоном. Возможно, с некоторой настройкой цвет может быть лучше, и для компактных графических интерфейсов пустое пространство не должно быть слишком сложным для короткой рекламы.

Смотрите Цвет окна по умолчанию Tkinter и шестнадцатеричные цветовые коды для получения информации о том, как я узнал о материалах цвета.

Ответ 4

Для тех, кто ненавидит ООП, как я (это основано на ответе Брайана Оукли)

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