首页 文章

如何让tkinter pack_forget调整父框架的大小?

提问于
浏览
0

在使用tkinter的python(2.7.12)中,我尝试实现以下内容:我想动态隐藏和取消隐藏某些文本标签 . 我尝试使用 pack_forget 然后再做一次 pack . 我要隐藏和取消隐藏的标签位于其他标签之间的固定位置(相对位置) . 当标签被隐藏时,它们将不占用空间 .

例如,考虑一个文本"not"作为句子的一部分出现或消失的标签 . 句子的其他部分也将形成标签 . 因此,我不能简单地在"not"标签上使用 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 并直接创建 label 作为 root 的子项,则一切正常:隐藏的标签确实占用零空间 .

1 回答

  • 1

    当您在容器中的最后一个窗口小部件上调用 pack_forget 时,容器会看到它没有子容,因此放弃了管理容器大小的责任 .

    一个简单的黑客是在容器中打包1x1小部件 . 这样做会触发 pack 来调整容器以使其适合,从而导致容器缩小 .

    pack 具有允许您将其放置在其他窗口小部件之前或之后的选项,因此您可以始终在隐藏窗口小部件之后跟踪该窗口小部件,以便稍后将其还原到正确的位置 .

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

相关问题