学习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用法汇总的更多相关文章

  1. tkinter之grid布局管理器详解

    在很久之前,我发过一篇<tkinter模块常用参数>,里面已经几乎涵盖了tkinter的大部分教程. 好吧,其实也就是上一篇而已啦. 所谓布局,就是指控制窗体容器中各个控件(组件)的位置关 ...

  2. [Tkinter 教程12] 布局管理 (Pack Place Grid)

    简介: 本文讲述如何使用 tkinter 的布局管理 (被称作 layout managers 或 geometry managers). tkinter 有三种布局管理方式: pack grid p ...

  3. Python基础=== Tkinter Grid布局管理器详解

    本文转自:https://www.cnblogs.com/ruo-li-suo-yi/p/7425307.html          @ 箬笠蓑衣 Grid(网格)布局管理器会将控件放置到一个二维的表 ...

  4. Python Tkinter Grid布局管理器详解

    Grid(网格)布局管理器会将控件放置到一个二维的表格里.主控件被分割成一系列的行和列,表格中的每个单元(cell)都可以放置一个控件. 注意:不要试图在一个主窗口中混合使用pack和grid (1) ...

  5. Python Tkinter模块 Grid(grid)布局管理器参数详解

    在使用Tkinter模块编写图像界面时,经常用到pack()和grid()进行布局管理,pack()参数较少,使用方便,是最简单的布局,但是当控件数量较多时,可能需要使用grid()进行布局(不要在同 ...

  6. python之tkinter使用-Grid(网格)布局管理器

    # 使用tkinter编写登录窗口 # Grid(网格)布局管理器会将控件放置到一个二维的表格里,主控件被分割为一系列的行和列 # stricky设置对齐方式,参数N/S/W/E分别表示上.下.左.右 ...

  7. tkinter学习-布局管理器

    阅读目录 pack 是按照添加顺序排列的组件 grid  是按照行/列形式排序的组件 place 允许程序员指定组件的大小和位置 pack: 说明:适用于少量的简单的组件的排列 fill:这个选项是告 ...

  8. Tkinter布局管理器

    Layout management in Tkinter 原英文教程地址:zetcode.com In this part of the Tkinter tutorial, we introduce ...

  9. Grid 布局管理器

    Grid 布局管理器: Grid布局类wx.GridSizer,Grid布局以网格形式对子窗口或控件进行摆放,容器被分成大小相等的矩形,一个矩形中放置一个子窗口或控件. wx.GridSizer构造方 ...

随机推荐

  1. 使用chrome的F12开发人员工具进行网页前端性能测试

    用chrome访问被测网站,定位到你要测试的动作所在页面或被测页面的前一页.按F12调出开发人员工具,其它的功能我就不介绍了,直接切换到性能选项卡Profiles. 点击start,生成ProFile ...

  2. 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 ...

  3. shell ss命令

    ss命令用来显示处于活动状态的套接字信息.ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比net ...

  4. 虚拟机 Linux

    VBox ubuntu安装增强功能

  5. C#父窗体右击事件实现

    之前在博问上提问过,没人回答啊,豆太少没人权? 没注册钩子的话根本没办法弹出右键菜单啊,因为在父窗体内有一个容器,所以鼠标在右击时是无法触发窗体的mousedown事件的,即使把KeyPreview设 ...

  6. Entity Framework之领域驱动设计实践

    http://www.cnblogs.com/daxnet/archive/2010/11/02/1867392.html

  7. [hdu4812]D Tree(点分治)

    题意:问有多少条路径,符合路径上所有节点的权值乘积模1000003等于k. 解题关键:预处理阶乘逆元,然后通过hash和树形dp$O(1)$的判定乘积存在问题,注意此道题是如何处理路径保证不重复的,具 ...

  8. 数组,for语句(补10.11)

    1.数组定义:一系列通数据类型的数据集合. 2.数组赋值的两种方法: 先定义后赋值:(赋值从0开始) var aa = new Arrey(); aa[0] = 1; aa[1] = 2; 定义并赋值 ...

  9. HDU - 2689 Sort it与2016蓝桥杯B 交换瓶子 排序(相邻交换与任意交换)

    Sort it You want to processe a sequence of n distinct integers by swapping two adjacent sequence ele ...

  10. CodeForces - 505B Mr. Kitayuta's Colorful Graph 二维并查集

    Mr. Kitayuta's Colorful Graph Mr. Kitayuta has just bought an undirected graph consisting of n verti ...