几何布局管理
Tkinter控件有特定的几何状态管理方法,管理整个控件区域组织,以下是Tkinter公开的几何管理类:包、网格、位置
几何方法 | 描述 |
---|---|
pack() | 包装布局,使用后对应组件将在窗口显示 |
grid() | 网格布局,使用后对应组件将在窗口显示 |
place() | 位置布局,使用后对应组件将在窗口显示 |
pack_forget() | 组件取消布局,pack布局组件可调用。取消映射后窗口不在显示对应组件,可以再次使用pack()重新映射 |
grid_forget() | 组件取消布局,grid布局组件可调用。取消映射后窗口不在显示对应组件,可以再次使用grid()重新映射 |
place_forget() | 组件取消布局,place布局组件可调用。取消映射后窗口不在显示对应组件,可以再次使用place()重新映射 |
grid_remove() | 取消映射,但记住网格选项,再次使用place()重新映射将会保持原本布局 |
destroy() | 销毁组件和所有后代小部件,无法恢复! |
pack
pack()
方法:是一种简单的布局方法,如果不加参数的默认方式,将按布局语句的先后,以最小占用空间的方式自上而下地排列控件实例,并且保持控件本身的最小尺寸。
使用pack()方法可设置 fill、side 等属性参数。pack
适用于简单的水平布局或者垂直方向布局。
参数
属性名 | 属性简析 | 取值 | 取值说明 |
---|---|---|---|
fill | 设置组件是否向水平或垂直方向填充,这个参数的优先级高于width和heigh; | X 、Y 、BOTH 和NONE | fill=X (水平方向填充),BOTH (水平和垂直),NONE 不填充当side="left"或side="right"时,fill="x"不起作用,只能填充y side=“top”,side="bottom"时,fill="y"不起作用,只能填充x |
expand | 设置组件是否展开,容器在整个窗口上,将容器放置在剩余空闲位置上的中央(包括水平和垂直方向) | YES、NO(1、0) | expand=1 或者expand="yes" ,表示放置在中央expand=0 或者expand="no" ,表示默认不扩展 |
side | 设置组件的对齐方式 | LEFT、TOP、RIGHT、BOTTOM | 值为左、上、右、下 |
ipadx /ipady | 设置x方向(或者y方向)内部间隙(子组件之间的间隔) | 可设置数值,默认是0 | 非负整数,单位为像素 |
padx /pady | 设置x方向(或者y方向)外部间隙(与之并列的组件之间的间隔) | 可设置数值,默认是0 | 非负整数,单位为像素 |
anchor | 锚选项,当可用空间大于所需求的尺寸时,决定组件被放置于容器的何处 | 共有9个参数可以设置n, s, w, e ,nw, ne, sw, se, center 分别是各个方向英语的缩写表示八个方向以及中心表示八个方向以及中心表示八个方向以及中心 | anchor放置容器时是相对于每一行放置的,重点在控制每一个容器在每一行的位置比较有用,要想实现相对于整个窗口的相对位置放置,可以参考 side |
方法
pack_slaves()
: 以列表方式返回本组件的全部子组件对象pack_configure(option=value)
: 给pack
布局管理器设置属性,使用属性option=value
方式设置propagate(boolean)
: 设置为 True 表示父组件的几何大小由子组件决定(默认值),反之则无关。ack_info()
: 返回pack提供的选项所对应得值。pack_forget()
:Unpack
组件,将组件隐藏而且忽略原有设置,对象依旧存在,能够用pack(option)
,将其显示。location(x, y)
: x, y为以像素为单位的点,函数返回此点是否在单元格中,在哪一个单元格中。返回单元格行列坐标,(-1, -1)表示不在其中size()
: 返回组件所包含的单元格,揭示组件大小
pack的组件空间布局原理分析
用pack进行的布局界面组件,可用以下一些界面布局空间来进行分析
side = top
的布局空间
side = left
的布局空间
设置代码 | 布局效果 | 说明 |
---|---|---|
.pack(side=‘top‘) | ![]() | 独占整行,缺省居中 |
.pack(side='top', anchor='sw') | ![]() | 没有启用可扩展空间,只独占行,锚定位 nw, w, sw 都一样,定位在西边 |
.pack(side='top', expand='yes', anchor='sw') | ![]() | 启用可扩展空间,除了独占的行空间,还扩展到了容器可用空间的所有列空间,锚定位’sw’ ,定位到了容器的西南边 |
.pack(side='top', expand='yes') | ![]() | 启动扩展空间,没有设置anchor,则缺省居中(整个组件占用空间的中间,不同于第1个例子) |
.pack(side='top', expand='yes', fill='y') | ![]() | 启用扩展空间,定位完后,进行“y”轴方向的填充,填满整个占用空间的列 |
.pack(side='top', fill='y') | ![]() | 没有启用扩展空间,当选择进行“y”方向填充时,也只是在独占的行空间内进行“y”方向填充 |
多组件布局的分析
我们现在基本掌握了单个组件的布局定位分析方法,而实际的软件界面,一定是多组件的综合布局,涉及多组件之间的相互关系和影响。以上所有讲到的单组件布局分析,都有一个前提,就是在已知容器可用空间的前提下, 进行当前组件的布局定位。
整理分析多组件布局的要点:
- 所有组件按代码的前后组织次序,依次进行布局定位
- 设置side = top / bottom 的组件,为上下排列的组件,独占当时可用空间的整行
- 设置side = left / right 的组件,为左右排列的组件,独占当时可用空间的整列
- 后辈组件不可进入任何前辈组件的独占空间,不论 side的设置如何,是否相同,一律都是前辈
- 组件可扩展空间,是动态的,是可以被后辈组件的独占空间占据压缩的,后辈组件可以从前辈可扩展空间的边缘开始入侵,直至压缩到前辈组件自身的独占空间为止
- 后辈组件的扩展空间,不能侵占前辈组件的扩展空间;既若扩展空间重叠,前辈享用扩展空间
- 若整个界面空间缩小,出现后辈组件独占空间跟前排组件独占空间重叠时,后辈组件将被压缩,直至消失。
- 若界面空间继续缩小,小到比组件独占空间小时,组件将被压缩,直至消失。
- 空间优先级别为:界面空间 > 前辈组件独占空间 > 后辈组件独占空间 > 前辈组件可扩展空间 > 后辈组件可扩展空间
- 可利用frame的多层嵌套,进行灵活布局
举例分析:
设置代码 | 布局效果 | 说明 |
---|---|---|
1.pack(side='left', expand='no', anchor='w', fill='y', padx=5, pady=5) 2. pack(side='top') 3. pack(side='right') 4. pack(side='bottom') | ![]() | 块1:第一个组件,可用空间为整个界面空间,靠左,独占列,不启动扩展空间,按“y”方向填充,周围有5个像素的padding 块2:可用空间从块1的右边缘开始,靠上,独占行,位置居中,但注意是从块1右边缘到界面边缘的中间位置,而不是整个界面的中间位置 块3:靠右,居中;其上下可用空间大小是块2的下边缘,到界面边缘 块4:靠下,居中;其左右可用空间大小是从块1的右边缘 到 块3的左边缘 |
1.pack(side='left', expand='yes', fill='x') 2. pack(side='top') 3. pack(side='right', expand='yes', fill='x') 4. pack(side='bottom') | ![]() | 这个例子比较复杂点 块1:启用了扩展空间,往“x”行方向填充,但被块2,块3,块4的独占空间压回到了现在的大小。 块2:同上,始终位于块1右边缘和界面边界的中间靠上位置 块3:启用了扩展空间,但也越不过块4的独占列空间 块4:始终位于块1,块3的中间位置靠下 |
1.pack(side='left', expand='no', fill='y') 2. pack(side='top', fill='x') 3. pack(side='right', expand='yes', fill='both') | ![]() | 一个很常规的导航界面设置 块1:导航栏 靠左,上下填充,不可扩展 块2:标题栏 靠上,左右扩展 块3:内容栏 位置无所谓,全面扩展填充 |