在Tkinter中如何让一个控件不可见?

57 投票
8 回答
177970 浏览
提问于 2025-04-16 04:44

像这样写的话,组件就会正常显示:

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

而像这样写的话,组件就根本不会显示:

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

8 个回答

5

我知道这个问题已经过了好几年,但截至2013年10月27日,这是关于“Tkinter隐藏标签”的第三个Google回复……所以如果有像我几周前一样正在构建简单图形界面的朋友,只想让一些文字出现,而不想通过“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()

这里的思路是,你可以把DISABLED状态下的文字颜色设置成父窗口的背景色('bg'),用“.cget('bg')”来获取背景色,这样文字就看起来“隐形”了。按钮的回调函数会把标签的颜色重置为默认的前景色,这样文字又会变得可见。

这里的缺点是,即使你看不见文字,你还是得为文字留出空间。而且至少在我的电脑上,文字和背景色并不能完全融合。也许通过一些调整,颜色的效果可以更好,对于紧凑的图形界面来说,留出一点空白空间也不算太麻烦,尤其是对于短文本。

想了解我如何发现这些颜色设置的,可以查看默认窗口颜色Tkinter和十六进制颜色代码

44

一种选择,如另一个回答中所解释的,可以使用 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()
77

你可能会对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()

撰写回答