我一直发现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
答案 0 :(得分:0)
要解决此问题,请在行首之后添加以下行:self.config(...
:
self.pack_propagate(0)
请参阅here的记录片对此进行解释。
正如@KārlisRieksts指出的那样,但是如果框架(或其他父窗口小部件)与place()几何管理器一起打包,则此方法不起作用。子控件将影响父控件的大小。
答案 1 :(得分:0)
为什么在框架内包装标签会影响其尺寸?
因为这是包装机设计的工作方式。它会收缩或增长以适合其内容,这是您99.99%的时间想要的。
有关pack
工作方式的规范文档,请参见此处的官方tcl / tk文档:
那么,避免此问题并按设置的大小固定所有内容的最佳方法是什么?
避免此“问题”的最佳等待方法是使用place
。但是,pack
和grid
的工作方式比使用place
创建可以处理字体大小,分辨率,然后用户手动调整窗口大小。
在用python / tkinter和tcl / tk编写GUI的几十年中,除了极端特殊的情况外,我从未使用过place
。对于必不可少的通用布局,它实在太难用了。
如果您绝对坚持使用pack
或grid
而不出现这种“缩小以适应”的情况,则可以将false值传递给以下方法的pack_propagate
或grid_propagate
方法:包含的框架(例如:self.pack_propagate(False)
)。以我的经验,这很少是正确的解决方案。