在使用tkinter的python(2.7.12)中,我尝试实现以下内容:我想动态隐藏和取消隐藏某些文本标签 . 我尝试使用 pack_forget
然后再做一次 pack
. 我要隐藏和取消隐藏的标签位于其他标签之间的固定位置(相对位置) . 当标签被隐藏时,它们将不占用空间 .
例如,考虑一个文本"not"作为句子的一部分出现或消失的标签 . 句子的其他部分也将形成标签 . 因此,我不能简单地在"not"标签上使用 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
的子项,则一切正常:隐藏的标签确实占用零空间 .
1 回答
当您在容器中的最后一个窗口小部件上调用
pack_forget
时,容器会看到它没有子容,因此放弃了管理容器大小的责任 .一个简单的黑客是在容器中打包1x1小部件 . 这样做会触发
pack
来调整容器以使其适合,从而导致容器缩小 .pack
具有允许您将其放置在其他窗口小部件之前或之后的选项,因此您可以始终在隐藏窗口小部件之后跟踪该窗口小部件,以便稍后将其还原到正确的位置 .您也可以切换到使用
grid
而不是pack
,因为grid
可以记住每个小部件的相对位置 .