> 文档中心 > Python Tkinter教程(三)——三种几何布局管理器Pack、Place和Grid的所有参数及相关方法及详细用法

Python Tkinter教程(三)——三种几何布局管理器Pack、Place和Grid的所有参数及相关方法及详细用法


>>>【 上节回顾:Label控件、Frame控件、Button控件的完整参数及详细用法 】<<<

Python Tkinter教程(三)

        这篇博客将详细并尽可能完整地介绍tkinter模块的3种几何布局管理器Pack、Place和Grid的所有参数及相关方法及详细使用方法,通过示例代码和图片的方式进行详细地教程。

目录

一、Pack方法

【参数说明】

【相关方法】

二、Place方法

【参数说明】 

【相关方法】

三、Grid方法

【参数说明】 

【相关方法】

【总结一下】


一、Pack方法

【Pack方法官方原文:pack manual page - Tk Built-In Commands】

【参数说明】

参数 描述
after 参数为另一个控件,在pack布局另外的那个控件之后再布局该控件
anchor 用于确定控件被放置相对于父控件的位置,可选项有'e','s','w','n','sw','se','nw','ne','center',默认为'center'
before 参数为另一个控件,在pack布局另外的那个控件之前先布局该控件
expand

指定控件在容器中是否可以扩展,可以是布尔值,可以是0,1或者'no',默认为0【1

fill

用于拉伸控件,可选的style有'none'(默认值,没有拉伸)

'x'(横向拉伸)、'y'(纵向拉伸)和'both'(双向拉伸)

【注:相关选项也可写为大写,如X或Y,此时不是字符串!

side

指定将控件放置相对于父控件在哪一边,可选项是'left'(左)、'right'(右)

'top'(上)和'bottom'(下),默认为'top'

【注:相关选项也可写为大写,如LEFT,此时不是字符串!

ipadx 水平的两个方向,控件内部额外添加空间,长度单位为像素
ipady 竖直的两个方向,控件内部额外添加空间,长度单位为像素
padx 水平的两个方向,控件外部额外添加空间,长度单位为像素
pady 竖直的两个方向,控件外部额外添加空间,长度单位为像素
in_ 指定pack于哪一个父控件,默认为当前父控件

1】如果容器窗口太大,以至于在其所有内容pack后会留下额外的空间,那么额外的空间将均匀分布在为其设置了-expand选项的所有内容中。

【相关方法】

方法名 描述
pack_configure 和pack一样
pack_forget 使控件不再被Pack几何布局管理器管理控件并不是被删除了!依然占用内存!
pack_info 返回一个字典,键值分别为当前控件的参数的字符串形式及值
pack_propagate 参数如果为真布尔值,如1或on,则为容器控件启用传播(见下几何传播),容器控件必须是窗口名。如果为假布尔值,则禁用容器控件的传播。在这两种情况下,都会返回一个空字符串。如果省略布尔值,则命令返回0或1,以指示当前是否为容器控件启用传播。默认情况下,将启用传播。
pack_slaves

返回一个列表,列表内容为该控件中所有用pack布局的子控件(按pack布局的顺序

一般容器控件才用该方法

pack_content 旧版Tkinter中,和pack_slaves()功能相同【新版中貌似已经删去此方法】

几何传播Pack通常会计算一个容器控件(如Frame控件)必须有多大才能完全满足其内容物的需要,并将容器控件的宽度和高度设置为这些尺寸。这会导致几何信息通过窗口层次向上传播到顶层窗口(Toplevel类型的控件),以便整个子树自行调整大小以满足叶窗口的需要。但是,pack_propagate命令可用于关闭一个或多个容器控件的传播。如果传播被禁用,则Pack几何布局管理器将不会设置pack所需的宽度和高度。例如,如果希望容器控件具有指定的固定大小,这可能很有用。

这里推荐一篇写的很好的关于Pack的文章

用tkinter.pack设计复杂界面布局_快乐清风客的博客-CSDN博客_tkinter界面设计

【代码示例】

from tkinter import *root = Tk()root.title('Pack方法')root.geometry('600x600+300+100')Frame(root,bg='red',width=100).pack(side='left',fill='y',expand='no')Frame(root,bg='yellow',height=100).pack(side='top',fill='x')Frame(root,bg='green').pack(expand=1,fill='both')root.mainloop()

【运行效果】

二、Place方法

【Place方法官方原文:place manual page - Built-In Commands】

【参数说明】 

参数 描述
anchor

改变place布局控件的基准点,默认为'nw'(左上角)

修改后其x参数和y参数的基准点随之改变

bordermode 可选参数有'inside','outside''ignore'默认为'inside'【1
in_ 同上Pack
relwidth

设置控件宽度,参数为0~1.0,意为宽度占父控件宽度的比例

若父控件宽度为100,relwidth=0.5,则该控件宽度为100×0.5=50(像素)

与参数width冲突,两者会叠加

relheight

设置控件高度,参数为0~1.0,意为高度占父控件高度的比例

若父控件高度为100,relheight=0.5,则该控件高度为100×0.5=50(像素)

与参数height冲突,两者会叠加

relx

设置控件基准点(左上角)横坐标位置,参数为0~1.0,意为横坐标占父控件宽度的比例

若父控件宽度为100,relx=0.5,则该控件基准点横坐标为100×0.5=50(像素)

与参数x冲突,两者会叠加

rely

设置控件基准点(左上角)纵坐标位置,参数为0~1.0,意为纵坐标占父控件高度的比例

若父控件高度为100,rely=0.5,则该控件基准点纵坐标为100×0.5=50(像素)

与参数y冲突,两者会叠加

width 设定控件的宽度(单位:像素
height 设定控件的高度(单位:像素
x 设定控件基准点(左上角)的横坐标位置(单位:像素)
y 设定控件基准点(左上角)的纵坐标位置(单位:像素)

1】该参数不常用,要参考的可以看一下官方说明:

(我就不翻译了,嘻嘻,主要是没看太懂,有懂的可以在评论区说一下哦!)

-bordermode mode

whether to take border width of master widget into account

Mode determines the degree to which borders within the container are used in determining the placement of the content. The default and most common value is inside. In this case the placer considers the area of the container to be the innermost area of the container, inside any border: an option of -x 0 corresponds to an x-coordinate just inside the border and an option of -relwidth 1.0 means window will fill the area inside the container's border.

If mode is outside then the placer considers the area of the container to include its border; this mode is typically used when placing window outside its container, as with the options -x 0 -y 0 -anchor ne. Lastly, mode may be specified as ignore, in which case borders are ignored: the area of the container is considered to be its official X area, which includes any internal border but no external border. A bordermode of ignore is probably not very useful.

【相关方法】

方法名 描述
place_configure 同上pack
place_forget 同上pack
place_info 同上pack
place_slaves 同上pack
place_content 同上pack

【代码示例】

from tkinter import *root = Tk()root.title('Place方法')root.geometry('600x600+300+100')Frame(root,bg='red').place(width=450,height=150)Frame(root,bg='yellow').place(width=150,height=450,x=450)Frame(root,bg='blue').place(width=450,height=150,x=150,y=450)Frame(root,bg='green').place(width=150,height=450,y=150)root.mainloop()

【运行效果】

三、Grid方法

【Grid方法官方原文:grid manual page - Tk Built-In Commands】

【参数说明】 

参数 描述
column 参数为一个非负整数,0为第1列,代表控件从第一列开始布局
columnspan 参数为正整数,控件占n列
row 参数为一个非负整数,0为第1行,代表控件从第一行开始布局
rowspan 参数为正整数,控件占n行
ipadx 同上Pack
ipady 同上Pack
padx 同上Pack
pady 同上Pack
in_ 同上Pack
sticky

控件在grid布局的网格中默认会居中显示,该参数可以改变其显示位置,

可选参数有'n','w','s'和'e'(或N,W,S,E)(组合起来也可以用,如'nw'或NW)

【相关方法】

方法名 描述
grid_configure 同上pack
grid_forget 同上pack
grid_info 同上pack
grid_location 两个参数x和y(代表像素位置),以元组形式返回该位置(x,y)在grid的网格中的列与行,若不在,则返回-1
grid_propagate 同上pack
grid_columnconfigure

比较复杂,主要用于查询设置网格、网格的行属性等,

可选参数有minsize、weight、uniformpad

具体见官方说明【传送门在上边】

grid_rowconfigure 类似于grid_columnconfigure
grid_remove 与grid_forget相比,它的功能只有一个区别,在grid几何布局管理移除对该控件的管理后,它会保留该控件之前的配置参数,若恢复管理,则将恢复该控件之前已配置好的参数(grid_forget没有此功能)
grid_size 以元组的形式返回网格的大小(先列后行)
grid_slaves 同上pack
grid_content 同上pack
grid_bbox

如果没有参数,将返回网格的边界框的数据(以像素为单位)。返回值由4个整数组成。前两个是从网格左上角(先x后y)的像素偏移量,后两个整数是网格的宽度和高度,也以像素为单位。

如果指定了单个列和行,则返回该单元格的边界框数据,其中左上角的单元格从零开始编号。

如果同时指定了列和行参数,则返回跨越所示行和列的边界框数据。

【代码示例】

from tkinter import *root = Tk()root.title('Grid方法')root.geometry('600x600+300+100')Frame(root,bg='red',width=300,height=300).grid(column=0,row=0)Frame(root,bg='yellow',width=300,height=300).grid(column=0,row=1)Frame(root,bg='blue',width=300,height=300).grid(column=1,row=0)Frame(root,bg='green',width=300,height=300).grid(column=1,row=1)root.mainloop()

【运行效果】


【总结一下】

Pack方法比较简单,可以解决不是非常复杂的图形化界面,但是它只能单一地放置,对于网格化的图形化界面,用Pack就比较繁琐;

Place方法十分精确,它要求了很多参数,能够轻松胜任复杂的图形化界面,但是缺陷也很明显,窗口放大或缩小,Place管理的控件并不能随之改变大小及位置;

Grid方法就是网格,字面意思嘛,它能够很好地应付网格化的图形化界面,但对于复杂且规律不明显的界面而言,Grid方法就显得不太行了;

各有各的优缺点,对于不同的程序我们应该选用合适的几何布局管理器,但是给个小建议,尽量不要在同一个程序中使用不同的几何布局管理器,那样容易把自己弄晕,且代码看起来不清晰。我呢,就比较喜欢用Place了,精确控制控件的大小及位置不就和我们小时候搭积木一样吗?简单容易,就是这个位置坐标有点“费头发”......


>>>【 下节内容:更新中 ... ... 】<<< 

说说控