对标签使用 pack() 几何管理器时禁止显示定义的帧大小



我一直发现 pack() 几何管理器在添加小部件时的行为方式方面非常模棱两可。 在这里,我有一个简单的代码,用于在更大的父框架中创建新框架。帧大小已设置为 300x300。问题是,如果我在此帧内使用 pack() 几何管理器创建一个标签,它将抑制原始帧大小。基本上,框架将变得和标签一样大。 如果我使用 place() 几何管理器,那么没有问题,框架保持原始 300x300 大小。

问题是 - 为什么在框架内包装标签会影响其尺寸?然后,避免此问题并将所有内容固定在设置大小的最佳方法是什么?

class MainRightFrame(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.place(x=600, y=0)
self.config(height=300, width=300, bg='green')
label = Label(self, text='Left Frame')
label.place(x=10, y=10)      # OPTION 1
# label.pack()               # OPTION 2

为什么在框架中打包标签会影响其大小?

因为这就是收盒机的设计方式。它会缩小或增长以适应其内容,这是您想要的 99.99% 的时间。

有关pack工作原理的规范文档,请参阅此处的官方 tcl/tk 文档:

打包器算法

然后,避免此问题并将所有内容固定在设置大小的最佳方法是什么?

避免这个"问题"的最佳等待是使用place.但是,packgrid的工作方式使得使用place创建响应式UI要容易得多,该UI可以处理字体大小,分辨率和用户手动调整窗口大小的更改。

在用python/tkinter和tcl/tk编写GUI的几十年里,除了非常特殊的情况外,我从未使用过place。对于必须的通用布局来说,它太难了。

如果你绝对坚持使用没有这种"缩小以适应"行为的packgrid,你可以将一个 false 值传递给包含帧的pack_propagategrid_propagate方法(例如:self.pack_propagate(False))。根据我的经验,这很少是正确的解决方案。

要解决此问题,请在行开头添加以下行:self.config(...

self.pack_propagate(0)

请参阅此处了解解释这一点的纪录片。

如@KārlisRieksts所述,如果框架(或其他父控件)包含 place() 几何管理器,则此方法不起作用。然后,子小部件将影响父小组件的大小。

最新更新