对标签使用pack()几何管理器时,已定义的框架大小被抑制

时间:2019-03-24 20:33:16

标签: python tkinter

我一直发现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

2 个答案:

答案 0 :(得分:0)

要解决此问题,请在行首之后添加以下行:self.config(...

self.pack_propagate(0)

请参阅here的记录片对此进行解释。

正如@KārlisRieksts指出的那样,但是如果框架(或其他父窗口小部件)与place()几何管理器一起打包,则此方法不起作用。子控件将影响父控件的大小。

答案 1 :(得分:0)

  

为什么在框架内包装标签会影响其尺寸?

因为这是包装机设计的工作方式。它会收缩或增长以适合其内容,这是您99.99%的时间想要的。

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

The packer algorithm

  

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

避免此“问题”的最佳等待方法是使用place。但是,packgrid的工作方式比使用place创建可以处理字体大小,分辨率,然后用户手动调整窗口大小。

在用python / tkinter和tcl / tk编写GUI的几十年中,除了极端特殊的情况外,我从未使用过place。对于必不可少的通用布局,它实在太难用了。

如果您绝对坚持使用packgrid而不出现这种“缩小以适应”的情况,则可以将false值传递给以下方法的pack_propagategrid_propagate方法:包含的框架(例如:self.pack_propagate(False))。以我的经验,这很少是正确的解决方案。