Python Tkinter 三种布局管理器详解:Pack、Grid 与 Place

巷口听风
巷口听风
发布时间:2026-10-15 | 2人浏览过
原创

本文详细介绍Python Tkinter库中的三种几何布局管理器:Pack、Grid和Place。通过对比分析,讲解Pack的自动堆叠、Grid的行列网格定位以及Place的坐标绝对定位特性,并提供常用属性与函数说明,帮助开发者根据界面复杂度选择合适的布局策略。

布局的核心作用在于控制窗体容器内各个控件(组件)之间的相对位置关系。

在tkinter中,主要提供了几种几何布局管理器供选择。

  • Pack布局方式。
  • Grid网格布局方式。
  • Place绝对定位布局方式。

采用Pack布局时,组件会按照添加顺序依次放入容器。默认情况下,第一个添加的组件位于最上方,后续组件依次向下排列。

from tkinter import *
root = Tk()
 
#创建三个 Label 分别添加到root窗体中 
#Label是一种用来显示文字或者图片的组件
Label(root,text = 'pack1',bg = 'red').pack() 
Label(root, text = 'pack2', bg = 'blue').pack() 
Label(root, text = 'pack3', bg = 'green').pack() 
 
root.mainloop()

具体效果可参考相关示意图。

Pack布局的常用属性说明。

属性名属性简析取值取值说明
fill设置组件是否向水平或垂直方向填充X、Y、BOTH 和NONEfill = X(水平方向填充)fill = Y(垂直方向填充)fill = BOTH(水平和垂直)NONE 不填充
expand设置组件是否展开,当值为YES时,side选项无效。组件显示在父容器中心位置;若fill选项为BOTH,则填充父组件的剩余空间。默认为不展开YES 、NO(1、0)expand=YES expand=NO
side设置组件的对齐方式LEFT、TOP、RIGHT、BOTTOM值为左、上、右、下
ipadx、ipady设置x方向(或者y方向)内部间隙(子组件之间的间隔)可设置数值,默认是0非负整数,单位为像素
padx、pady设置x方向(或者y方向)外部间隙(与之并列的组件之间的间隔)可设置数值,默认是0非负整数,单位为像素
anchor锚选项,当可用空间大于所需求的尺寸时,决定组件被放置于容器的何处N、E、S、W、NW、NE、SW、SE、CENTER(默认值为CENTER)表示八个方向以及中心

需注意,上表中的取值均为常量形式,例如YES等价于字符串"yes",也可直接传入字符串值。随着界面复杂度的提升,往往需要通过多层嵌套容器来实现特定的布局效果。

from tkinter import *    #注意模块导入方式,否则代码会有差别
 
class App:
    def __init__(self, master):
        #使用Frame增加一层容器
        fm1 = Frame(master)
        #Button是一种按钮组件,与Label类似,只是多出了响应点击的功能
        Button(fm1, text='Top').pack(side=TOP, anchor=W, fill=X, expand=YES)
        Button(fm1, text='Center').pack(side=TOP, anchor=W, fill=X, expand=YES)
        Button(fm1, text='Bottom').pack(side=TOP, anchor=W, fill=X, expand=YES)
        fm1.pack(side=LEFT, fill=BOTH, expand=YES)
 
        fm2 = Frame(master)
        Button(fm2, text='Left').pack(side=LEFT)
        Button(fm2, text='This is the Center button').pack(side=LEFT)
        Button(fm2, text='Right').pack(side=LEFT)        
        fm2.pack(side=LEFT, padx=10)
        
root = Tk()
root.title("Pack - Example")
display = App(root)
root.mainloop()

示例中,首先创建一个Frame容器fm1,将三个垂直排列的Button组件通过Pack布局放入fm1;接着创建另一个Frame容器fm2,将三个水平排列的Button组件放入其中;最后,将这两个Frame容器作为子组件,使用Pack布局添加到根窗体容器中。

这种分层布局的方式,能够有效满足相对复杂的界面设计需求。

Pack类提供了以下方法,可通过组件实例对象进行调用。

函数名描述
pack_slaves()以列表方式返回本组件的所有子组件对象。
pack_configure(option=value)给pack布局管理器设置属性,使用属性(option)= 取值(value)方式设置
propagate(boolean)设置为True表示父组件的几何大小由子组件决定(默认值),反之则无关。
pack_info()返回pack提供的选项所对应得值。
pack_forget()Unpack组件,将组件隐藏并且忽略原有设置,对象依旧存在,可以用pack(option, …),将其显示。
location(x, y)x, y为以像素为单位的点,函数返回此点是否在单元格中,在哪个单元格中。返回单元格行列坐标,(-1, -1)表示不在其中
size()返回组件所包含的单元格,揭示组件大小。

Grid布局方式。

Grid布局常被称为网格布局,也是官方推荐使用的布局方式。由于大多数程序界面呈矩形,可以将其划分为若干行和列组成的网格,并根据行号(row)和列号(column)将组件放置到对应的网格单元中。需要注意的是,row和column的索引均从0开始计数。

界面划分网格的示意如下。


Grid布局的属性设置说明。

属性名属性简析取值取值说明
row、columnrow为行号,column为列号,设置将组件放置于第几行第几列取值为行、列的序号,不是行数与列数row 和 column 的序号从0开始,但是,column的默认值是0,row的默认值是下一个编号较大的未占用行号
sticky设置组件在网格中的对齐方式(前提是有额外的空间)N、E、S、W、NW、NE、SW、SE类似于pack布局中的锚选项
rowspan组件所跨越的行数默认值为1取值为跨越占用的行数,而不是序号
columnspan组件所跨越的列数默认值为1取值为跨越占用的列数,而不是序号
ipadx、ipady、padx、pady组件的内部、外部间隔距离,与pack的该属性用法相同同pack同pack

Grid类提供了以下方法,可通过组件实例对象进行调用。

函数名描述
grid_slaves()以列表方式返回本组件的所有子组件对象。
grid_configure(option=value)给pack布局管理器设置属性,使用属性(option)= 取值(value)方式设置
grid_propagate(boolean)设置为True表示父组件的几何大小由子组件决定(默认值),反之则无关。
grid_info()返回pack提供的选项所对应得值。
grid_forget()Unpack组件,将组件隐藏并且忽略原有设置,对象依旧存在,可以用pack(option, …),将其显示。
grid_location(x, y)x, y为以像素为单位的点,函数返回此点是否在单元格中,在哪个单元格中。返回单元格行列坐标,(-1, -1)表示不在其中
size()返回组件所包含的单元格,揭示组件大小。

Place布局方式。

这是最简单且最灵活的布局方式,通过指定组件的坐标来定位其位置。不过,由于不同分辨率下界面显示差异较大,通常不推荐使用此方式。

Place布局的属性设置说明。

属性名属性简析取值取值说明
anchor锚选项,同pack布局默认值为 NW同pack布局
x、y组件左上角的x、y坐标整数,默认值0绝对位置坐标,单位像素
relx、rely组件相对于父容器的x、y坐标0~1之间浮点数相对位置,0.0表示左边缘(或上边缘),1.0表示右边缘(或下边缘)
width、height组件的宽度、高度非负整数单位像素
relwidth、relheight组件相对于父容器的宽度、高度0~1之间浮点数与relx(rely)取值相似

关于bordermode属性:若设置为INSIDE,组件的大小和位置是相对的,不包含边框;若设置为OUTSIDE,组件的外部大小是相对的,包含边框。该属性支持常量INSIDE、OUTSIDE(默认值为INSIDE),也支持字符串形式"inside"、"outside"。

Place类提供了以下方法,可通过组件实例对象进行调用。

函数名描述
place_slaves()以列表方式返回本组件的所有子组件对象。
place_configure(option=value)给pack布局管理器设置属性,使用属性(option)= 取值(value)方式设置
propagate(boolean)设置为True表示父组件的几何大小由子组件决定(默认值),反之则无关。
place_info()返回pack提供的选项所对应得值。
grid_forget()Unpack组件,将组件隐藏并且忽略原有设置,对象依旧存在,可以用pack(option, …),将其显示。
location(x, y)x, y为以像素为单位的点,函数返回此点是否在单元格中,在哪个单元格中。返回单元格行列坐标,(-1, -1)表示不在其中
size()返回组件所包含的单元格,揭示组件大小。

以上内容为个人经验总结,旨在提供参考,希望对大家有所帮助。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表