2017-02-13 171 views
0

在python(2.7.12)与tkinter我尝试实现以下:我想要动态隐藏和取消隐藏某些文本标签。我尝试使用pack_forget,然后再做一次pack。我要隐藏和取消隐藏的标签位于其他标签中的固定位置(相对位置)。当标签被隐藏时,它们不应占用空间。如何让tkinter pack_forget调整父框架?

例如,考虑将文本“不”作为句子的一部分出现或消失的标签。句子的其他部分也可以用标签形成。因此,我不能简单地在该“不”标签上使用pack_forget,然后使用packpack不会将标签放置在其以前的位置,而是放在装箱清单的末尾。因此,为了确保标签保持其相对位置(并避免再次包装所有东西),我做了以下工作:我创建一个框架,将其包装在我的标签应该出现/消失的位置,然后放入里面的标签。然后,我隐藏/取消隐藏标签,但不隐藏框架。

我的期望是,框架的大小应根据标签内是否隐藏而自行调整。当然,当标签可见时,框架应该足够大以容纳它。但是,在标签上呼叫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和直接创建labelroot孩子,一切工作正常:隐藏的标签确实消耗零空间。

回答

1

当您在容器中的最后一个小部件上调用pack_forget时,容器会发现它没有子项,因此放弃了管理容器大小的责任。

简单的破解就是在容器中打包一个1x1小部件。这样做会触发pack调整容器以适应容器,导致容器缩小。

pack有多个选项可让您将其放置在其他小部件之前或之后,因此您可以随时跟踪小部件,使其可以隐藏后再将其恢复到正确的位置。

您也可以切换到使用grid而不是pack,因为grid可以记住每个小部件的相对位置。