Tkinter 的三大布局管理器 pack、grid 和 place用法汇总
学习python的tkinter免不了要对各个组件进行位置的排放与设定,常用的布局管理器有grid,pack和place。这三种均用于同一父组件下的组件布局,但是也是有区别的,先看下他们各自的含义吧。
pack:按添加顺序排列组件
grid:按行列形式排列组件
place:允许程序员指定组件的大小和位置
常用方法:这里先列出来,后文会对个方法进行说明
pack常用的方法 pack(**options)
pack_configure(**options)
pack_forget()
pack_info()
pack_propagate(flag)
pack_slaves() grid常用方法 grid(**options)
grid_bbox(column=None, row=None, col2=None, row2=None)
grid_columnconfigure(index, **options)
grid_configure(**options)
grid_forget()
grid_info()
grid_location(x, y)
grid_propagate(flag)
grid_remove()
grid_rowconfigure(index, **options)
grid_size()
grid_slaves(row=None, column=None) place常用方法 place(**options)
place_configure(**options)
place_forget()
place_info()
place_slaves()
slaves()
使用说明
pack管理器使用:
pack适合于少量的组件排序,所以在使用上是相当简单,一般添加组件后直接使用.pack()方法即可。。但是如果想要对复杂的组件进行布局,那就要使用grid()或者Frame框架。
注:同一个父组件中不能同时使用pack()和grid(),否则Tkinter会一直纠结先用哪个布局管理器,所以就卡死在纠结中了。
先来看个例子吧,是经常要用到的情况:将一个组件放到一个容器组件中,并填充整个父组件。
from tkinter import *
root = Tk()
listbox = Listbox(root)
listbox.pack(fill=BOTH,expand=True) #fill选项是填充整个父组件,expand选项是拉伸时依旧填满
for i in range():
listbox.insert(END,str(i))
mainloop()
执行结果:

其中,fill 选项是告诉窗口管理器该组件将填充整个分配给它的空间,BOTH 表示同时横向和纵向扩展,X 表示横向,Y 表示纵向。expand 选项是告诉窗口管理器将父组件的额外空间也充满
默认下,pack 是将添加的组件一次纵向排列
from tkinter import *
root = Tk()
Label(root,text="red",bg="red",fg="white").pack(fill=X) #fill选项是设置横向填充
Label(root,text="red",bg="green",fg="black").pack(fill=X)
Label(root,text="red",bg="blue",fg="white").pack(fill=X) # Label(root,text="red",bg="red",fg="white").pack(side=RIGHT)#如果想将组件整体横向排序,可以设置side选择
mainloop()
执行结果:

grid管理器的使用
grid 管理器可以说是 Tkinter 这三个布局管理器中最灵活多变的。如果你只希望学习使用一个布局管理器,那么 grid 绝对是首选。当你在设计对话框的时候,使用 grid 尤其便捷。使用一个 grid 就可以简单的实现你用很多个框架和 pack 搭建起来的效果。
使用 grid 排列组件,只要告诉它你想要组件放置的位置(行 / 列,row 选项指定行,column 选项指定列)。此外你并不用提前指出网格(grid 分布给组件的位置称为网格)的尺寸,因为管理器会自动计算。
来看一个简单的登录界面:
from tkinter import *
root = Tk()
Label(root,text="用户名:").grid(row=,column=)
Label(root,text="密 码:").grid(row=,column=) Entry(root).grid(row=,column=)
Entry(root,show="*").grid(row=,column=)
mainloop()
执行结果:

用几个网格来放置一个组件,可以使用 rowspan 和columnspan 实现跨行跨列的功能
from tkinter import * root = Tk() Label(root, text="用户名").grid(row=, sticky=W)
Label(root, text="密码").grid(row=, sticky=W) photo = PhotoImage(file="gaga.png")
Label(root, image=photo).grid(row=, column=, rowspan=, padx=, pady=)
#rowspan选项设置了跨行,现在photo组件可以显示0,1两行了。padx,pady设置了边距,使图片文字不挨在一起11 Entry(root).grid(row=, column=)
Entry(root, show="*").grid(row=, column=) Button(root,text="提交", width=).grid(row=, columnspan=, pady=) root.mainloop()
执行结果:

place管理器使用
通常情况下不建议使用 place 布局管理器,因为对比起 pack 和 grid,place 要做更多的工作。不过存在即合理,place 在一些特殊的情况下可以发挥妙用,甚至是 pack 和 grid 无法代替。
将子组件显示在父组件的正中间
from tkinter import * root = Tk()
def callback():
print('真的点到我了')
Button(root, text='点我呀', command=callback).place(relx=0.5, rely=0.5, anchor=CENTER) #relx和rely是相对父组件的位置。0是最左边,.5是正中间,1是最右边
mainloop()
执行结果:

在某种情况下,你希望一个组件能够覆盖另一个组件。下面使用一个按钮覆盖一个Label图片的例子
from tkinter import * root = Tk()
photo = PhotoImage(file="gaga.png")
Label(root, image=photo).pack()
def callback():
print('点到我了')
Button(root, text='点我', command=callback).place(relx=0.5, rely=0.5, anchor=CENTER) #relx和rely是相对父组件的位置,范围是 00~1.0。0是最左边,.5是正中间,1是最右边
mainloop()
执行结果:

relheight 和 relwidth 选项则是指定相对于父组件的尺寸
from tkinter import * root = Tk() Label(root, bg='red').place(relx=0.5, rely=0.5, relheight=0.75, relwidth=0.75, anchor=CENTER) #relheight和relwidth是设置调用place的子组件相对于父组件的高度和宽度
Label(root, bg='yellow').place(relx=0.5, rely=0.5, relheight=0.5, relwidth=0.75, anchor=CENTER)
Label(root, bg='green').place(relx=0.5, rely=0.5, relheight=0.25, relwidth=0.75, anchor=CENTER) mainloop()
执行结果:

还有 x 和 y 选项用于设置偏移(像素),如果同时设置 relx(rely) 和 x(y),那么 place 将优先计算 relx 和 rely,然后再实现 x 和 y 指定的偏移值。
pack的方法
注:下面方法适用于所有组件
pack(**options) --下方详细列举了各个选项的具体含义和用法
|
选项 |
含义 |
|
anchor |
--控制组件在pack分配的空间中的位置 --N, NE, E, SE, S, SW, W, NW或CENTER来定位(EWSN表示东南西北) --默认值是CENTER |
|
expand |
--指定是否填充父组件的额外空间 --默认值是False |
|
fill |
--指定填充pack分配的空间 --默认值是NONE,表示保持子组件的原始尺寸 --还可以使用的值有:X(水平填充),Y(垂直填充)和BOTH(水平和垂直填充) |
|
in_ |
--将该组件放到该选项指定的组件中 --指定的组件必须是该组件的父组件 |
|
ipadx |
--指定水平方向上的内边距 |
|
ipady |
--指定垂直方向上的内边距 |
|
padx |
--指定水平方向上的外边距 |
|
pady |
--指定垂直方向上的外边距 |
|
side |
--指定组件的放置位置 --默认值是TOP --还可以设置的值有:LEFT,BOTTOM,RIGHT |
pack_configure(**options) --跟 pack() 一样
pack_forget() --将组件从屏幕中“删除” --并没有销毁该组件,只是看不到了 --可以通过 pack 或其他布局管理器显示已“删除”的组件
pack_info() --以字典的形式返回当前的 pack 的选项
pack_propagate(flag) --如果开启,父组件会自动调节尺寸以容纳所有子组件 --默认值是开启(flag=True) --该方法仅适用于父组件
pack_slaves() --以列表形式返回该组件的所有子组件 --该方法仅适用于父组件
grid 的方法:
注:下边方法适用于所有组件
grid(**options) --下面列举了各个选项的具体含义和用法
| 选项 | 含义 |
| column |
--指定组件插入的列(0表示第一列) --默认值是0 |
| columnspan | --指定用多少列(跨列)显示该组件 |
| in_ |
--将该组件放到该选项指定的组件中 --指定的组件必须是该组件的父组件 |
| ipadx | --指定水平方向上的内边距 |
| ipady | --指定垂直方向上的内边距 |
| padx | --指定水平方向上的外边距 |
| pady | --指定垂直方向上的外边距 |
| row | --指定组件插入的行(0表示第一行) |
| rowspan | --指定用多少行(跨行)显示该组件 |
| sticky | --控制组件在grid分配的空间中的位置
--可以使用N,E,S,W以及他们的组合来定位 --使用加号(+)表示拉长填充,例如N+S表示将该组件垂直拉长填充网格,N+S+W+E表示填充整个网格 --不指定该值则居中显示 |
grid_bbox(column=None, row=None, col2=None, row2=None)
--返回一个四元组描述该组件所在的限定矩形 --如果指定 column 和 row 参数,则返回该位置 (column, row) 的组件的限定矩形的描述
grid_columnconfigure(index, **options)
--设置列的属性--注意:设置的是该组件所拥有的grid序列
可以设置的选项及含义如下:
| 选项 | 含义 |
| minsize |
--指定该列的最小宽度 |
| pad |
--指定该列中最大网格的水平边距 |
| weight |
--指定列与列之间的相对距离 --默认值是0 --说明:初创建窗口的时候,grid会自动根据组件的尺寸分配窗口的尺寸,当你拉伸窗口的尺寸就会有空白显示出来。这个选项正是指定列与列之间是否填充空白,默认是不填充的。另外,该选项的值是指定填充空白的倍数,例如weight=2的列会比weight=1的列填充多一倍的空白,所以需要平均填充的话,只需要所有的列都设置为weight=1即可。 |
grid_configure(**options) --跟 grid() 一样
grid_forget() --将组件从屏幕中“删除” --并没有销毁该组件,只是看不到了 --可以通过 grid 或其他布局管理器显示已“删除”的组件,但该组件所在网格的选项设置不会恢复
grid_info() --以字典的形式返回当前 grid 的选项
grid_location(x, y) --返回位于(或接近)给定坐标(x, y)的网格位置 --返回值是一个 2 元组表示网格对应的(列, 行)
grid_propagate(flag) --如果开启,父组件会自动调节尺寸以容纳所有子组件 --默认值是开启(flag=True) --该方法仅适用于父组件
grid_remove() --跟 grid_forget() 一样,但恢复的时候会记住该组件所在网格的选项设置
grid_rowconfigure(index, **options) --设置行的属性 --注意:设置的是该组件所拥有的grid的行
可以设置的选项及含义如下:
| 选项 | 含义 |
| minsize |
--指定该列的最小宽度 |
| pad |
--指定该列中最大网格的垂直边距 |
| weight |
--指定行于行之间的相对距离 --默认值是0 |
grid_size() --返回该组件所拥有的 grid 的尺寸 --返回值是一个 2 元组,表示(列,行)分别的网格数
grid_slaves(row=None, column=None) --以列表的形式返回该组件的所有子组件 --该方法仅适用于父组件
place的方法
注:下边的方法适用于所有的组件
place(**options) --下方列举了各个选项的含义和用法
|
选项 |
含义 |
|
anchor |
--控制组件在place分配的空间中的位置 --N, NE, E, SE, S, SW, W, NW或CENTER来定位(EWSN表示东南西北) --默认值是NW |
|
bordermode |
--指定边框模式(INSIDE或OUTSIDE) --默认值是INSIDE |
|
height |
--指定该组件的高度(像素) |
|
in_ |
--将该组件放到该选项指定的组件中 --指定的组件必须是该组件的父组件 |
|
relheight |
--指定该组件相对于父组件的高度 --取值范围是0.0~1.0 |
|
relwidth |
--指定该组件相对于父组件的宽度 --取值范围是0.0~1.0 |
|
relx |
--指定该组件相对于父组件的水平位置 --取值范围是0.0~1.0 |
|
rely |
--指定该组件相对于父组件的垂直位置 --取值范围是0.0~1.0 |
|
width |
--指定该组件的宽度(像素) |
|
x |
--指定该组件的水平偏移位置(像素) --如果同时指定了relx选项,优先实现relx选项 |
|
y |
--指定该组件的垂直偏移位置(像素) --如果同时指定了rely选项,优先实现rely选项 |
place_configure(**options) --跟place()一样
place_forget() --将组件从屏幕中“删除” --并没有销毁该组件,只是看不到了 --可以通过 place 或其他布局管理显示已“删除”的组件
place_info() --以字典的形式返回当前 place 的选项
place_slaves() --以列表的形式返回该组件的所有子组件 --该方法仅适用于父组件
slaves() --跟 place_slaves() 一样
Tkinter 的三大布局管理器 pack、grid 和 place用法汇总的更多相关文章
- tkinter之grid布局管理器详解
在很久之前,我发过一篇<tkinter模块常用参数>,里面已经几乎涵盖了tkinter的大部分教程. 好吧,其实也就是上一篇而已啦. 所谓布局,就是指控制窗体容器中各个控件(组件)的位置关 ...
- [Tkinter 教程12] 布局管理 (Pack Place Grid)
简介: 本文讲述如何使用 tkinter 的布局管理 (被称作 layout managers 或 geometry managers). tkinter 有三种布局管理方式: pack grid p ...
- Python基础=== Tkinter Grid布局管理器详解
本文转自:https://www.cnblogs.com/ruo-li-suo-yi/p/7425307.html @ 箬笠蓑衣 Grid(网格)布局管理器会将控件放置到一个二维的表 ...
- Python Tkinter Grid布局管理器详解
Grid(网格)布局管理器会将控件放置到一个二维的表格里.主控件被分割成一系列的行和列,表格中的每个单元(cell)都可以放置一个控件. 注意:不要试图在一个主窗口中混合使用pack和grid (1) ...
- Python Tkinter模块 Grid(grid)布局管理器参数详解
在使用Tkinter模块编写图像界面时,经常用到pack()和grid()进行布局管理,pack()参数较少,使用方便,是最简单的布局,但是当控件数量较多时,可能需要使用grid()进行布局(不要在同 ...
- python之tkinter使用-Grid(网格)布局管理器
# 使用tkinter编写登录窗口 # Grid(网格)布局管理器会将控件放置到一个二维的表格里,主控件被分割为一系列的行和列 # stricky设置对齐方式,参数N/S/W/E分别表示上.下.左.右 ...
- tkinter学习-布局管理器
阅读目录 pack 是按照添加顺序排列的组件 grid 是按照行/列形式排序的组件 place 允许程序员指定组件的大小和位置 pack: 说明:适用于少量的简单的组件的排列 fill:这个选项是告 ...
- Tkinter布局管理器
Layout management in Tkinter 原英文教程地址:zetcode.com In this part of the Tkinter tutorial, we introduce ...
- Grid 布局管理器
Grid 布局管理器: Grid布局类wx.GridSizer,Grid布局以网格形式对子窗口或控件进行摆放,容器被分成大小相等的矩形,一个矩形中放置一个子窗口或控件. wx.GridSizer构造方 ...
随机推荐
- 使用chrome的F12开发人员工具进行网页前端性能测试
用chrome访问被测网站,定位到你要测试的动作所在页面或被测页面的前一页.按F12调出开发人员工具,其它的功能我就不介绍了,直接切换到性能选项卡Profiles. 点击start,生成ProFile ...
- listen and translation exercise 53
It was hard work and there weren't any interesting things for him. You should be an expert with comp ...
- shell ss命令
ss命令用来显示处于活动状态的套接字信息.ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比net ...
- 虚拟机 Linux
VBox ubuntu安装增强功能
- C#父窗体右击事件实现
之前在博问上提问过,没人回答啊,豆太少没人权? 没注册钩子的话根本没办法弹出右键菜单啊,因为在父窗体内有一个容器,所以鼠标在右击时是无法触发窗体的mousedown事件的,即使把KeyPreview设 ...
- Entity Framework之领域驱动设计实践
http://www.cnblogs.com/daxnet/archive/2010/11/02/1867392.html
- [hdu4812]D Tree(点分治)
题意:问有多少条路径,符合路径上所有节点的权值乘积模1000003等于k. 解题关键:预处理阶乘逆元,然后通过hash和树形dp$O(1)$的判定乘积存在问题,注意此道题是如何处理路径保证不重复的,具 ...
- 数组,for语句(补10.11)
1.数组定义:一系列通数据类型的数据集合. 2.数组赋值的两种方法: 先定义后赋值:(赋值从0开始) var aa = new Arrey(); aa[0] = 1; aa[1] = 2; 定义并赋值 ...
- HDU - 2689 Sort it与2016蓝桥杯B 交换瓶子 排序(相邻交换与任意交换)
Sort it You want to processe a sequence of n distinct integers by swapping two adjacent sequence ele ...
- CodeForces - 505B Mr. Kitayuta's Colorful Graph 二维并查集
Mr. Kitayuta's Colorful Graph Mr. Kitayuta has just bought an undirected graph consisting of n verti ...