我一直发现 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
.但是,pack
和grid
的工作方式使得使用place
创建响应式UI要容易得多,该UI可以处理字体大小,分辨率和用户手动调整窗口大小的更改。
在用python/tkinter和tcl/tk编写GUI的几十年里,除了非常特殊的情况外,我从未使用过place
。对于必须的通用布局来说,它太难了。
如果你绝对坚持使用没有这种"缩小以适应"行为的pack
或grid
,你可以将一个 false 值传递给包含帧的pack_propagate
或grid_propagate
方法(例如:self.pack_propagate(False)
)。根据我的经验,这很少是正确的解决方案。
要解决此问题,请在行开头添加以下行:self.config(...
:
self.pack_propagate(0)
请参阅此处了解解释这一点的纪录片。
如@KārlisRieksts所述,如果框架(或其他父控件)包含 place() 几何管理器,则此方法不起作用。然后,子小部件将影响父小组件的大小。