在python(2.7.12)与tkinter我尝试实现以下:我想要动态隐藏和取消隐藏某些文本标签。我尝试使用pack_forget
,然后再做一次pack
。我要隐藏和取消隐藏的标签位于其他标签中的固定位置(相对位置)。当标签被隐藏时,它们不应占用空间。如何让tkinter pack_forget调整父框架?
例如,考虑将文本“不”作为句子的一部分出现或消失的标签。句子的其他部分也可以用标签形成。因此,我不能简单地在该“不”标签上使用pack_forget
,然后使用pack
:pack
不会将标签放置在其以前的位置,而是放在装箱清单的末尾。因此,为了确保标签保持其相对位置(并避免再次包装所有东西),我做了以下工作:我创建一个框架,将其包装在我的标签应该出现/消失的位置,然后放入里面的标签。然后,我隐藏/取消隐藏标签,但不隐藏框架。
我的期望是,框架的大小应根据标签内是否隐藏而自行调整。当然,当标签可见时,框架应该足够大以容纳它。但是,在标签上呼叫pack_forget
后,框架的大小应该再次缩小到零。
但是,这不起作用:最初,框架实际上具有零大小。但是,在内部的文本标签已经可见一次后,该框架保持其大小。在框架内的标签上调用pack_forget
后,标签的文本实际上消失了,但框架不收缩为零。
我在做什么错?
这里是一个完整的代码示例(改编自example by Tony Veijalainen)。在我的系统中,至少它显示了行为,即文本实际上消失了,但框架保持其宽度(和高度),但情况并非如此。
from Tkinter import *
def toggle():
if label.winfo_ismapped():
button['text']='unmap'
label.pack_forget()
else:
button['text']='map'
label.pack()
root = Tk()
button = Button(text="Push me", command=toggle)
button.pack()
labelFrame = Frame()
labelFrame.pack()
label = Label(labelFrame, text="Hello Big Big World")
label.pack()
root.wait_window()
如果在例子中,你删除labelFrame
和直接创建label
为root
孩子,一切工作正常:隐藏的标签确实消耗零空间。