Tkinter自学02:tkinter 的3种布局管理器

一、简介

所谓布局管理,就是对添加到窗口中的组件的大小和位置进行设置。此外,当用户调整了窗口大小后,布局管理器还会自动调整窗口中各个组件的大小和位置。
tkinter有三种布局管理器:
(1)Pack
(2)Gird
(3)Place

二、pack布局

使用pack布局时,当向窗口中添加组件时,这些组件会依次向后排列,排列方向可以是水平的,也可以是垂直的。

1.pack的参数

通常我推荐使用python自带的help()来查看我们不太熟悉的函数。

>>> help(tkinter.Label.pack)
Help on function pack_configure in module tkinter:

pack_configure(self, cnf={}, **kw)
    Pack a widget in the parent widget. Use as options:
    after=widget - pack it after you have packed widget
    anchor=NSEW (or subset) - position widget according to
                              given direction                                                                                     
    before=widget - pack it before you will pack widget                                                                           
    expand=bool - expand widget if parent size grows
    fill=NONE or X or Y or BOTH - fill widget if widget grows
    in=master - use master to contain this widget
    in_=master - see 'in' option description
    ipadx=amount - add internal padding in x direction
    ipady=amount - add internal padding in y direction
    padx=amount - add padding in x direction
    pady=amount - add padding in y direction
    side=TOP or BOTTOM or LEFT or RIGHT -  where to add this widget.

从上面可以看到,pack通常支持以下的方法:

方法名称 作用 可用的参数
anchor 根据给定方向放置位置小部件 N,W,S,E,NW,NE,SW,SE,CENTER(实际上是东南西北方位的简称,上北下南左西右东
expand 指定当父级容器增大时是否拉伸组件 布尔值,True,False
fill 设置组件是否延水平或垂直方向填充 X,Y,BOTH,NONE
ipadx 指定组件在x方向(水平方向)的内部留白 数值,表示像素
ipady 指定组件在y方向(垂直方向)的内部留白 数值,表示像素
padx 指定组件在x方向(水平方向)与其他组件的间距 数值,表示像素
pady 指定组件在y方向(垂直方向)与其他组件的间距 数值,表示像素
side 设置组件的添加位置 TOP,BOTTOM,LEFT,RIGHT

以上就是pack的常用参数,推荐自己试一试。下面介绍几种常用的参数的使用效果。

2.几个参数的使用效果示例

先写一个没有参数的栗子。

from tkinter import *

root = Tk()

lab1 = Label(root,text="第一个标签",bg="red")
lab2 = Label(root,text="第二二个标签",bg="yellow")
lab3 = Label(root,text="第三三三个标签",bg="green")

lab1.pack()
lab2.pack()
lab3.pack()

root.mainloop()

结果如下:


原始.png

(1)side的使用

还是上面的栗子,稍微改一下

lab1.pack(side=TOP)
lab2.pack(side=LEFT)
lab3.pack(side=BOTTOM)

side.png

可以看到,side会改变排列位置。其他的情况可以自己试试。

(2)fill的使用

将原始的栗子改一下:

lab1.pack(fill=X)
lab2.pack(fill=Y)
lab3.pack(fill=NONE)
fill.png

实际上,第二个标签是垂直方向填充的,只是这里看不出来,还是建议自己尝试。

(3)anchor的使用

lab1.pack(anchor=N)
lab2.pack(anchor=E)
lab3.pack(anchor=SW)
anchor.png

(4)综合使用

多种属性综合起来使用,可以得到自己想要的结果,建议自己多去尝试。
这里举一个小栗子。

lab1.pack(side=LEFT,fill=Y)
lab2.pack(fill=X)
lab3.pack(fill=BOTH,expand=True)

image.png

当窗口大小改变时
image.png

注意看看什么改变,什么没改变。起到作用的参数分别是哪些?

三、Grid布局

Grid布局是Tkinter后来引入的布局方式,相对来说,使用更方便简单。而且相比Pack布局,Grid布局在细节的调整上要更加强大。
Grid布局将容器空间分成一个个类似excel表格的单元格,按照行(row)列(column)的方式排列组件,组件位置由其行和列的值来决定:
行号相同而列号不同的几个组件会被依次上下排列
列号相同而行号不同的几个组件会被依次左右排列
使用Grid布局的过程就是为各个组件指定行号和列号的过程,不需要为每个网格指定大小,Grid布局会自动设置合适的大小。

1.Grid的参数

还是推荐使用python自带的help()来查看我们不太熟悉的函数。

>>> help(tkinter.Label.grid)
Help on function grid_configure in module tkinter:

grid_configure(self, cnf={}, **kw)
    Position a widget in the parent widget in a grid. Use as options:
    column=number - use cell identified with given column (starting with 0)
    columnspan=number - this widget will span several columns
    in=master - use master to contain this widget
    in_=master - see 'in' option description
    ipadx=amount - add internal padding in x direction
    ipady=amount - add internal padding in y direction
    padx=amount - add padding in x direction
    pady=amount - add padding in y direction
    row=number - use cell identified with given row (starting with 0)
    rowspan=number - this widget will span several rows
    sticky=NSEW - if cell is larger on which sides will this
                  widget stick to the cell boundary

上面的参数与Pack的很多都相同,其余的参数都很好理解,简单列在下面供参考:

方法名称 作用 可用的参数
row 指定行号 从0开始为第1行
column 指定列号 从0开始为第1列
rowspan 指定跨越的行的数量 默认为1,跨越多行则指定数值
columnspan 指定跨越的列的数量 默认为1,跨越多列则指定数值
sticky 指定组件粘在单元格哪个方位的边界上 与anchor一样

2.几个Grid的参数的演示

接Pack的第一个栗子,将布局方式稍微做一下改变:

lab1.grid(row=0,column=0)
lab2.grid(row=0,column=1)
lab3.grid(row=1,column=1)
grid.png

注意到,类似excel,列宽默认根据最宽的组件宽度来设置,行高也是一样的,这里没有演示,可以自己试试。

四、Place布局

Place布局就是其他GUI布局中的“绝对布局”,要求指定每个组件的绝对位置或者相对于其他组件的相对位置。

Place的参数

还是先看help:

>>> help(tkinter.Label.place)
Help on function place_configure in module tkinter:

place_configure(self, cnf={}, **kw)
    Place a widget in the parent widget. Use as options:
    in=master - master relative to which the widget is placed
    in_=master - see 'in' option description
    x=amount - locate anchor of this widget at position x of master
    y=amount - locate anchor of this widget at position y of master
    relx=amount - locate anchor of this widget between 0.0 and 1.0
                  relative to width of master (1.0 is right edge)
    rely=amount - locate anchor of this widget between 0.0 and 1.0
                  relative to height of master (1.0 is bottom edge)
    anchor=NSEW (or subset) - position anchor according to given direction
    width=amount - width of this widget in pixel
    height=amount - height of this widget in pixel
    relwidth=amount - width of this widget between 0.0 and 1.0
                      relative to width of master (1.0 is the same width
                      as the master)
    relheight=amount - height of this widget between 0.0 and 1.0                                                                  
                       relative to height of master (1.0 is the same
                       height as the master)
    bordermode="inside" or "outside" - whether to take border width of
                                       master widget into account

不做过多的介绍了,参数基本上能看懂,无非就是指定绝对的位置和相对的位置,而一般来说Place用得较少。

总结:整体来看,个人觉得使用的优先级是:Grid>Pack>Place

所以还是推荐Grid布局管理,方便快捷,整体设计起来比较方便。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容