在Tkinter中如何让一个控件不可见?
像这样写的话,组件就会正常显示:
Label(self, text = 'hello', visible ='yes')
而像这样写的话,组件就根本不会显示:
Label(self, text = 'hello', visible ='no')
8 个回答
我知道这个问题已经过了好几年,但截至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和十六进制颜色代码。
一种选择,如另一个回答中所解释的,可以使用 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()
你可能会对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()