Tkinter :布局管理器 pack , grid , place

布局管理器:pack

pack,grid,place 均用于管理同在一个父组件下的所有组件的布局,

  • pack 是按添加顺序排列组件
  • grid 是按行列的形式排列组件
  • place 是允许程序猿指定组件的大小和位置

pack更适用于少量组件的排列,但是在使用上更加简单,如果是创建复杂的布局结构,建议使用多个框架(frame)或grid .。

但是不要在同一个父组件中混合适用 pack 和 grid ,这会导致混乱而不能生成窗口。

pack 的参数:

选项 含义
anchor 1. 控制组件在 pack 分配的空间中的位置 2. “n”, “ne”, “e”, “se”, “s”, “sw”, “w”, “nw”, 或者 “center” 来定位(ewsn 代表东西南北,上北下南左西右东) 3. 默认值是 “center”
expand 1. 指定是否填充父组件的额外空间 2. 默认值是 False
fill 1. 指定填充 pack 分配的空间 2. 默认值是 NONE,表示保持子组件的原始尺寸 3. 还可以使用的值有:“x”(水平填充),“y”(垂直填充)和 “both”(水平和垂直填充)
in_ 1. 将该组件放到该选项指定的组件中 2. 指定的组件必须是该组件的父组件
ipadx 指定水平方向上的内边距
ipady 指定垂直方向上的内边距
padx 指定水平方向上的外边距
pady 指定垂直方向上的外边距
side 1. 指定组件的放置位置 2. 默认值是 “top” 3. 还可以设置的值有:“left”,“bottom”,“right”

pack_configure(**options)
– 跟 pack() 一样

pack_forget()
– 将组件从屏幕中“删除”
– 并没有销毁该组件,只是看不到了
– 可以通过 pack 或其他布局管理器显示已“删除”的组件

pack_info()
– 以字典的形式返回当前 pack 的选项

pack_propagate(flag)
– 如果开启,父组件会自动调节尺寸以容纳所有子组件
– 默认值是开启(flag = True)
– 该方法仅适用于父组件

pack_slaves()
– 以列表的形式返回该组件的所有子组件
– 该方法仅适用于父组件

默认下,pack 是将添加的组件依次纵向排列,使用 side 来改变成横向。
在这里插入图片描述

布局管理器:grid

grid 管理器可以说是 Tkinter 这三个布局管理器中最灵活多变的。使用一个 grid 就可以简单的实现你用很多个框架和 pack 搭建起来的效果。

使用 grid 排列组件,只需告诉它你想要将组件放置的位置(行/列,row 选项指定行,cloumn 选项指定列)。此外,你并不用提前指出网格(grid 分布给组件的位置称为网格)的尺寸,因为管理器会自动计算。

grid(**options)
– 下方表格详细列举了各个选项的具体含义和用法:

选项 含义
column 1. 指定组件插入的列(0 表示第 1 列) 2. 默认值是 0
columnspan 指定用多少列(跨列)显示该组件
in_ 1. 将该组件放到该选项指定的组件中 2. 指定的组件必须是该组件的父组件
ipadx 指定水平方向上的内边距
ipady 指定垂直方向上的内边距
padx 指定水平方向上的外边距
pady 指定垂直方向上的外边距
row 指定组件插入的行(0 表示第 1 行)
rowspan 指定用多少行(跨行)显示该组件
sticky 1. 控制组件在 grid 分配的空间中的位置 2. 可以使用 “n”, “e”, “s”, “w” 以及它们的组合来定位(ewsn代表东西南北,上北下南左西右东) 3. 使用加号(+)表示拉长填充,例如 “n” + “s” 表示将组件垂直拉长填充网格,“n” + “s” + “w” + “e” 表示填充整个网格 4. 不指定该值则居中显示

默认情况下组件会居中显示在对应的网格里,你可以使用 sticky 选项来修改这一特性。该选项可以使用的值有 “e”,“w”,“s”,“n”(ewsn 分别表示东西南北,即上北下南左西右东)以及它们的组合。因此,我们可以通过 sticky = “w” 使得 组件左对齐

grid_columnconfigure(index, **options)
– 设置列的属性
– 注意:设置的是该组件所拥有的 grid 的列
– 可以设置的选项及含义如下:

选项 含义
minsize 指定该列的最小宽度
pad 指定该列中最大网格的水平边距
weight 1. 指定列与列之间的相对距离 2. 默认值是 0 3. 这个你比较难理解,小甲鱼还是详细解说下:初创建窗口的时候,grid 会自动根据组件的尺寸分配窗口的尺寸,当你拉伸窗口的尺寸时就会有空白显示出来。这个选项正是指定列与列之间是否填充空白,默认是不填充的。另外,该选项的值是指定填充空白的倍数,例如 weight = 2 的列会比 weight = 1 的列填充多一倍的空白。所以需要平均填充的话,只需要所有的列都设置 weight = 1 即可。

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 1. 指定行与行之间的相对距离 2. 默认值是 0 3. 这个你比较难理解,不懂可以参考上边 grid_columnconfigure() 的详细解释

grid_size()
– 返回该组件所拥有的 grid 的尺寸
– 返回值是一个 2 元组,表示(列, 行)分别的网格数

grid_slaves(row=None, column=None)
– 以列表的形式返回该组件的所有子组件
– 该方法仅适用于父组件

在这里插入图片描述

布局管理器: place

通常情况下不建议使用 place 布局管理器,因为对比起 pack 和 grid,place 要做更多的工作。不过纯在即合理,place 在一些特殊的情况下可以发挥妙用。请看下边例子。

place(**options)
– 下方表格详细列举了各个选项的具体含义和用法:

选项 含义
anchor 1. 控制组件在 place 分配的空间中的位置 2. “n”, “ne”, “e”, “se”, “s”, “sw”, “w”, “nw”, 或 “center” 来定位(ewsn代表东西南北,上北下南左西右东) 3. 默认值是 “nw”
bordermode 1. 指定边框模式(“inside” 或 “outside”) 2. 默认值是 “inside”
height 指定该组件的高度(像素)
in_ 1. 将该组件放到该选项指定的组件中 2. 指定的组件必须是该组件的父组件
relheight 1. 指定该组件相对于父组件的高度 2. 取值范围 0.0 ~ 1.0
relwidth 1. 指定该组件相对于父组件的宽度 2. 取值范围 0.0 ~ 1.0
relx 1. 指定该组件相对于父组件的水平位置 2. 取值范围 0.0 ~ 1.0
rely 1. 指定该组件相对于父组件的垂直位置 2. 取值范围 0.0 ~ 1.0
width 指定该组件的宽度(像素)
x 1. 指定该组件的水平偏移位置(像素) 2. 如同时指定了 relx 选项,优先实现 relx 选项
y 1. 指定该组件的垂直偏移位置(像素) 2. 如同时指定了 rely 选项,优先实现 rely 选项

place_configure(**options)
– 跟 place() 一样

place_forget()
– 将组件从屏幕中“删除”
– 并没有销毁该组件,只是看不到了
– 可以通过 place 或其他布局管理器显示已“删除”的组件

place_info()
– 以字典的形式返回当前 place 的选项

place_slaves()
– 以列表的形式返回该组件的所有子组件
– 该方法仅适用于父组件

slaves()
– 跟 place_slaves() 一样

import tkinter as tk
 
root = tk.Tk()
 
tk.Label(root, bg="red").place(relx=0.5, rely=0.5, relheight=0.75, relwidth=0.75, anchor="center")
tk.Label(root, bg="yellow").place(relx=0.5, rely=0.5, relheight=0.5, relwidth=0.5, anchor="center")
tk.Label(root, bg="green").place(relx=0.5, rely=0.5, relheight=0.25, relwidth=0.25, anchor="center")

tk.Button(root, text="点我").place(relx=0.5, rely=0.5, anchor="center") 

root.mainloop()

这是全屏的,相对位置还是不变

x 和 y 选项用于设置偏移(像素),如果同时设置 relx(rely)和 x(y),那 place 将优先计算 relx 和 rely,然后再实现 x 和 y 指定的偏移值。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46192930/article/details/106728493
今日推荐