Tkinter 打包方法混淆

Cr1*_*064 2 python tkinter

我不明白为什么包管理器不会让你在顶部打包的小部件下方打包左和右。我的以下代码的预期输出将是

 A
 B
C D 
 E
Run Code Online (Sandbox Code Playgroud)

但它只显示:

 A
 B
C D
Run Code Online (Sandbox Code Playgroud)
 A
 B
C D 
 E
Run Code Online (Sandbox Code Playgroud)

Bry*_*ley 5

简而言之,packer 并非旨在直接创建您要创建的布局。你可以做到,但它需要一些额外的帧。在这种特殊情况下,您显然是在尝试创建网格,grid这可以说是更好的选择。

在我解释为什么会这样之前,让我提出一个解决方案。创建另一个名为“CD”的框架,用于保存CD。然后您可以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)
Run Code Online (Sandbox Code Playgroud)

解释打包机

封隔器通过沿未分配空间的一侧保留一块空间来工作。 这个分配的空间在将小部件打包到顶部或底部时占据了未分配空间的全部宽度,在左侧或右侧打包时占据了全部高度。这是一个重要的细节。

让我试着用一些截图来描述它。在所有情况下,以下屏幕截图都没有显示帧,它们显示了打包程序管理的已分配和未分配空间量。

当您A沿顶部打包时(如果您未指定边,则默认为顶部),将为根窗口的整个宽度保留一块空间。而且因为你把它打包到顶部,唯一剩下的空间在下面A。从现在开始,没有任何东西可以包装在左边或右边A

(实际上,您可以使用一些高级选项将东西放在左侧或右侧,但这超出了本说明的范围)

A 后的可用空间

当您沿顶部打包 B 时,唯一可用的空间在下方A。同样,因为您将其打包在顶部,打包后B现在唯一可用的可用空间将在B.

B 后的可用空间

当您C沿左侧打包时,会为剩余空间的整个高度保留一块空间。这意味着什么都不能放在下面C。所有剩余空间都在 的右侧C和下方B

C 后的可用空间

  1. 当您打包时D,它必须位于右侧C和下方B。因为你把它打包到右边,它会保留上下所有剩余的垂直空间D

D 后的可用空间

当你E沿着底部打包时,它唯一可以去的地方是下面B、右边C和左边D

E 后的可用空间

由于封隔器沿边分配所有空间的性质,封隔器在所有小部件放置在同一轴上时效果最佳 - 无论是垂直堆叠还是水平堆叠。当您想像使用C和那样切换轴时D,通常最好将它们放在单独的框架中。在该框架内,您可以从左到右放置小部件,但该框架可以像其他小部件一样保持在自上而下的轴上。

注意:这就是您的代码中实际发生的情况:E被挤压在C和之间D。由于各种原因,它不可见,但如果你给它一个明确的大小和颜色,它就会显示出来。

想要查询更多的信息

打包算法的权威描述可以在packtcl/tk 手册页中找到