简而言之,打包程序并不是为了直接创建您要创建的布局而设计的。您可以做到,但需要一些额外的框架。在这种特殊情况下,您显然正在尝试创建一个网格,grid
可以说是更好的选择。
在解释为什么会这样之前,让我提出一个解决方案。创建另一个名为“CD”的框架,用于容纳两者C
and D
。然后就可以打包了C
向左和D
到右边,然后把这个框架放在下面B
。这就是您使用加壳器获得所需结果的方式。
A = tk.LabelFrame(root,text='A', bd=2)
B = tk.LabelFrame(root,text='B', bd=2)
CD = tk.Frame(root)
C = tk.LabelFrame(CD,text='C', bd=2)
D = tk.LabelFrame(CD,text='D', bd=2)
E = tk.LabelFrame(root,text='E', bd=2)
C.pack(side=tk.LEFT,fill=tk.BOTH, expand=tk.TRUE)
D.pack(side=tk.RIGHT,fill=tk.BOTH, expand=tk.TRUE)
A.pack(fill=tk.BOTH, expand=tk.TRUE)
B.pack(fill=tk.BOTH, expand=tk.TRUE)
CD.pack(fill=tk.BOTH, expand=tk.TRUE)
E.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.TRUE)
解释一下打包机
加壳器的工作原理是沿着未分配空间的一侧保留一块空间。当将小部件打包到顶部或底部时,此分配的空间会占用未分配空间的整个宽度,并且在左侧或右侧打包时会占用整个高度。这是一个重要的细节。
让我尝试用一些屏幕截图来描述它。在所有情况下,以下屏幕截图均不显示帧,而是显示加壳程序管理的已分配和未分配空间量。
当你打包时A
沿着顶部(如果不指定边,则默认为顶部),为根窗口的整个宽度保留一块空间。因为你把它挤到了顶部,所以唯一剩下的空间就在下面A
。左边或右边不能装任何东西A
从现在开始。
(实际上,您可以使用一些高级选项将内容放在左侧或右侧,但这超出了本描述的范围)
当你沿着顶部包装B时,唯一可用的空间在下面A
。再说一次,因为你把它沿着顶部包装,包装后B
现在唯一可用的可用空间将在下面B
.
当你打包时C
沿着左边,为剩余空间的整个高度保留一块空间。这意味着下面不能放置任何内容C
。所有剩余空间都在右侧C
,以及以下B
.
- 当你打包时
D
,它必须位于右侧C
及以下B
。因为你把它放在右边,所以它会保留上面和下面所有剩余的垂直空间D
.
当你打包时E
沿着底部,它唯一能去的地方就是下面B
, 在 - 的右边C
,以及左边D
.
由于打包程序沿着一侧分配所有空间的性质,因此当所有小部件都放置在同一轴上(垂直或水平堆叠)时,打包程序效果最佳。当你想像下面那样切换轴时C
and D
,通常最好将它们放在单独的框架内。在该框架内,您可以从左到右放置小部件,但该框架可以像其他小部件一样保留在从上到下的轴上。
注意:这是您的代码中实际发生的情况:E
被挤压在之间C
and D
。由于各种原因它是不可见的,但是如果你给它一个明确的大小和颜色,那么它就会显示出来。
了解更多信息
加壳算法的权威描述可以在tcl/tk 包的手册页.