在Tkinter有什么方法可以使小部件不可见?

rec*_*gle 35 python tkinter

像这样的东西,会使小部件正常显示:

Label(self, text = 'hello', visible ='yes') 
Run Code Online (Sandbox Code Playgroud)

虽然这样的事情会使小部件根本不出现:

Label(self, text = 'hello', visible ='no') 
Run Code Online (Sandbox Code Playgroud)

luc*_*luc 51

您可能对 小部件的方法pack_forgetgrid_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()
Run Code Online (Sandbox Code Playgroud)

  • `grid_remove`是另一种选择.它优于`grid_forget`是网格将记住所有选项,因此一个简单的`grid()`将把它放回去.没有`pack_remove`. (33认同)
  • @Bateman:您可以通过再次调用`pack()` 来恢复它(假设您已经保留了对小部件的引用)。这是因为 `pack_forget()` 只是让小部件消失了,但它仍然存在。 (2认同)

Bry*_*ley 28

如另一个答案所解释的,一种选择是使用pack_forgetgrid_forget.另一个选择是使用liftlower.这会更改窗口小部件的堆叠顺序.实际效果是你可以隐藏兄弟小部件(或兄弟姐妹的后代)后面的小部件.如果你希望它们对你们可见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()
Run Code Online (Sandbox Code Playgroud)

  • +1是一个完美的例子,如何处理误解;-)很高兴看到地球上仍有礼貌和理性的人 (34认同)
  • @AndyL:我现在使用tkinter很多(大约2011年),并且有大约15年的tk经验,可以很好地翻译.坦率地说,我觉得这个解决方案没有用,你错了,但我很想听听你的理由.为什么你说你认为它不起作用?你知道的情况是这样,还是你猜?顺便说一下,谢谢提醒升降机.我有时会忘记tkinter必须偏离tk的原生api来容纳python的语法,而lift是我很少需要使用的一个命令.我已经更新了我的答案. (8认同)
  • 在重新阅读我的评论之后,我想说我绝对不会像听起来那样具有攻击性.我很抱歉.我做了我最初的评论,因为我之前尝试过你的解决方案而无法让它为我工作.每当我试图降低其父级后面的小部件时,我得到了一个TclError.这可能是我自己的失误.你能提供代码来启发我吗? (8认同)
  • @AndyL:我的错.回顾我的回答,我看到我错误地解释了解决方案.你是对的,你不能隐藏其父级后面的小部件,但你可以将其隐藏在其他小部件后面.我已经更新了我的答案并包含了一个例子.谢谢你引起我的注意. (8认同)
  • 我可能是错的,但我认为这不适用于Python/Tkinter.通过使用`raise()`来猜测,这是一个Python保留字(它实际上叫做`lift()`),我不认为你使用Python/Tkinter. (3认同)

小智 5

我知道这已经晚了几年了,但这是截至 2013 年 10 月 27 日 Google 对“Tkinter hide Label”的第三次回应...所以,如果几周前像我这样的人正在构建一个简单的 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()
Run Code Online (Sandbox Code Playgroud)

这里的想法是,您可以使用“.cget('bg')” http://effbot.org/tkinterbook/widget.htm渲染它,将 DISABLED 文本的颜色设置为父级的背景 ('bg') “无形的”。按钮回调将标签重置为默认前景色,并且文本再次可见。

这里的缺点是,即使您无法阅读文本,您仍然必须为文本分配空间,并且至少在我的计算机上,文本不能完美地融入背景。也许通过一些调整,颜色可能会更好,并且对于紧凑的 GUI,空白空间分配对于简短的简介来说应该不会太麻烦。

有关我如何发现颜色内容的信息,请参阅默认窗口颜色 Tkinter 和十六进制颜色代码。