tkinter的.pack方法未正确分割空间

时间:2018-09-27 22:51:06

标签: python-3.x tkinter

试图弄清楚包装顺序。书说

  

在为小部件提供型腔空间后,展开将剩余的空间除掉,并在其指定的空间内填充和锚定拉伸和定位小部件。

所以我写了以下内容,但不明白为什么东西方标签没有扩展到共享北方的某些垂直空间:

from tkinter import *

root = Tk()

north = Label(root,text='North', bg='cyan')
north.pack(side=TOP, expand=YES, fill=BOTH)

west = Label(root,text='West', bg='red')
west.pack(side=LEFT, expand=YES, fill=BOTH)

east = Label(root,text='East', bg='green')
east.pack(side=RIGHT, expand=YES, fill=BOTH)

root.mainloop()

裁剪后的屏幕快照:

Cropped screen-shot of what I see

Cropped image of what I'd like to see

1 个答案:

答案 0 :(得分:0)

north打包到顶部时,它将占用可用空间的全部宽度。一旦在顶部包装了东西,其他任何东西都将无法进入它的左侧或右侧(无需使用一些很少使用的附加选项)。然后将west放在左侧时,它必须位于north下方。

这是完整打包程序算法的正式说明:

  

对于每个主服务器,打包机都维护一个有序的从服务器列表,称为打包列表。 -in,-after和-before配置选项用于指定每个从属服务器的主服务器以及从服务器在装箱单中的位置。如果没有为从属服务器提供这些选项,则将从属服务器将被添加到其父服务器的装箱单的末尾。

     

打包机通过按顺序扫描装箱单来安排从属机作为主机。在处理每个从站时,主站内的矩形区域仍未分配。这个区域称为空腔;对于第一个从属服务器,它是主机的整个区域。

     

对于每个从属,打包程序将执行以下步骤:

     
      
  1. 打包机沿着从站的-side选项给出的空腔侧面为从站分配一个矩形包裹。如果侧面是顶部或底部,则包裹的宽度为型腔的宽度,其高度为从属设备要求的高度加上-ipady和-pady选项。对于左侧或右侧,地块的高度是型腔的高度,宽度是从属设备要求的宽度加上-ipadx和-padx选项。由于使用-expand选项,包裹可能会进一步扩大(请参见下面的EXPANSION)

  2.   
  3. 打包机选择从站的尺寸。该宽度通常是从站请求的宽度加上其-ipadx选项的两倍,而高度通常是从站请求的高度加上其-ipady选项的两倍。但是,如果-fill选项为x或两者均为x,则将扩展从属服务器的宽度以填充宗地的宽度,减去-padx选项的两倍。如果-fill选项为y或两者皆有,则将扩展从属服务器的高度以填充包裹的宽度,减去-pady选项的两倍。

  4.   
  5. 打包机将从站放置在其包裹上。如果从站小于包裹,则-anchor选项确定将从站放置在包裹中的位置。如果-padx或-pady不为零,则给定的外部填充量将始终留在从属对象与宗地边缘之间。

  6.   
     

给定一个从属设备打包后,将从腔中减去其包裹的区域,为下一个从属设备保留较小的矩形腔。如果从属服务器未使用其所有地块,则后续的从属服务器将不使用包裹中未使用的空间。如果腔体变得太小而不能满足奴隶的需求,那么无论腔体中剩余多少空间,奴隶都会得到分配。如果型腔缩小到零大小,则装箱单上所有剩余的从属设备将不被映射到屏幕上,直到主窗口变得足够大以再次容纳它们为止。

取自http://tcl.tk/man/tcl8.5/TkCmd/pack.htm#M26

在同一文档中,它说明了扩展(expand属性):

  

额外的水平空间分布在-side为左或右的可扩展从属之间,而额外的垂直空间分布在-side为top或bottom的可扩展从属之间。


要仅使用pack来获得所需的行为,请首先在顶部和底部包装两个框架(或几乎任何小部件中的两个)。将expand属性设置为True。然后,您可以让底部框架成为红色和绿色框架的主体。