tkinter中各种组件都是通过调用组件的一些方法,将组件添加到父组件中。具体有三种布局方式,思路和可配置的参数也都不一样。
Packer
该方法最为简单,主要思路就是通过调用组件的pack
方法,将组件按顺序添加到其父组件中,其中的参数决定了该组件以什么方式添加到父组件中。没有参数时,默认就是将组件从上到下添加到父组件中,即side = 'top'
。关于该方法的参数可以参考pack命令的官方文档,其中几个重要的参数如下:
anchor
:该参数决定了组件添加到父组件的位置,默认值为’center’,表示添加到父组件中间。'w’表示添加到父组件左边;side
:该参数决定了组件按什么方向添加到父组件,默认值为’top’,表示从上到下添加。'left’从左到右,'right’从右到左,'bottom’从下到上;fill
:该参数决定了组件如果比父组件小,是否在某个方向上拉伸填充剩余可用空间。默认值为’none’,即不填充;'x’表示水平填充;‘y’表示垂直填充;‘both’表示两个方向上均填充。注意仅能填充剩余的可用空间。若side
为’top’或’botoom’,即纵向添加组件,水平方向上可以自由填充,但垂直方向上无法填充;若side
为’left’或’right’,即横向添加组件,垂直方向上可以自由填充,但水平方向上无法填充。上面两种情况的原因个人推断是不确定后面是否还会新添加组件,而无法计算填充宽度或高度。不过此时可以组合使用expand=1
和fill='y'
,使得组件先占据剩余空间,之后再拉伸填充;expand
:该参数表示是否让组件占据剩余空间,并不拉伸组件。默认为0,即不占空间;1则表示占据剩余空间;padx
,pady
:这两个参数分别表示水平和垂直方向上的外边距;ipadx
,ipady
:这两个参数分别表示水平和垂直方向上的内边距;
此外还有如下几个相关方法:
pack_forget()
:隐藏该组件;pack_info()
:当前的打包信息,返回值为字典形式;pack_propagate(flag)
:用在父组件上,表示是否自动调节尺寸以容纳所有子组件,默认开启;pack_slaves()
:用在父组件上,表示当前通过pack方法加入该组件的子组件列表;
Grid
正如其名,调用组件的grid
方法进行布局就是将组件以表格的方式添加到父组件中。谈到表格,自然首先就会想到行和列。没错,grid
方法中最重要的两个参数就是row
和column
,指明组件所在的单元格位置。Tk中行和列也都从0开始计数。有些组件可能需要占据几行或几列,那么就需要用rowspan
和columnspan
代替row
和column
,表示占据行列的数量。该方法中没有anchor
、fill
和expand
选项,取而代之的是一个sticky
选项。该选项类似anchor
,值是方向字母,表示组件在该单元格中的定位方式,如sticky='w'
表示左对齐。该选项也接收多个方向字母的组合,这样就可以实现fill
的功能。比如sticky='we'
,就表示水平拉伸,等同于fill='x'
。不过这种拉伸仅在组件小于单元格大小时将组件在某个方向上拉伸到单元格的大小,而单元格的大小又只能由其中的组件大小决定。因此想让某个单元格更宽更高,更多的还是需要调整其中包含组件的宽高属性。
其他参数还可以参考grid命令的官方文档。
Placer
最后就是最自由的方法,place
就是通过坐标和大小,完全自定义组件的位置。谈到坐标则一定先要有参考坐标系,与常用计算机视觉中的坐标系一致,Tkinter中同样是左上角是原点(0,0)
,向右为x正方向,向下为y正方向。参数可以参考place命令的官方文档,其中几个重要的参数如下:
anchor
:该参数决定了坐标表示的是组件的哪个位置,默认值为’nw’,即把组件的左上角放在坐标的位置;x
,y
:这两个参数就指明了在父组件参考坐标系中组件的位置,以像素为单位;relx
,rely
:这两个参数是小数,表示相对坐标,以父组件的宽高为基准,值在0.0~1.0
之间;width
,height
:这两个参数则指明了组件的大小,以像素为单位;relwidth
,relheight
:这两个参数是小数,表示相对大小,以父组件宽高为基准,值在0.0~1.0
之间;
可以发现坐标参数中既有相对坐标和绝对坐标,使用绝对坐标时,组件位置比较固定;使用相对坐标时,在缩放主程序窗口时,组件的位置会随着窗口变化对应变化,宽高比比较固定。两种坐标还可以同时设置,此时相对坐标优先操作,然后是在这个相对坐标的基础上再进行绝对坐标偏移。实践中往往并不这样使用,否则会头昏眼花。