В Tkinter есть ли способ сделать виджет невидимым? - PullRequest
30 голосов
/ 29 сентября 2010

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

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

Хотя как-то так, виджет вообще не появится:

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

Ответы [ 5 ]

47 голосов
/ 29 сентября 2010

Вас могут заинтересовать методы виджета 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()
27 голосов
/ 08 мая 2011

Один вариант, как объяснено в другом ответе, заключается в использовании 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()
4 голосов
/ 27 октября 2013

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

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

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

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

1 голос
/ 11 апреля 2019

Чтобы скрыть виджет, вы можете использовать функцию pack_forget (), а чтобы снова показать его, вы можете использовать функцию pack () и реализовать их обе в отдельных функциях.

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()
0 голосов
/ 21 января 2019

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

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...