Tkinter布局管理
Tkinter的布局方法
在我们日常的界面编写中,存在很多的组件,我们要像搭建积木的形式一样,将这些组件放到窗口界面的某个位置进行布局。
在Tkinter中提供了pack()、guid()和place()三个方法来进行布局
pack()方法
相对于其他方法,pack相对简单,能够快速地完成布局。
pack()方法的基本语法:
button = tk.Button(root, text="确定", command=test)
button.pack(**options)
pack()方法提供的选项:
| 选项参数 | 参数作用 | 取值范围 |
|---|---|---|
| padx | 参数设置指定组件与容器边缘的水平间距。 | 整数(像素单位) |
| pady | 参数设置指定组件与容器边缘的垂直间距。 | 整数(像素单位) |
| ipadx | 表达内部填充,增加按钮内容与边框的水平距离。 | 整数(像素单位) |
| ipady | 表达内部填充,增加按钮内容与边框的垂直距离。 | 整数(像素单位) |
| side | 组件停靠在父级的排列方式。 | “top”(默认:由上往下排列、 “bottom”:由下往上排列、 “left”:由左往右排列、 “right”:由右往左排列 |
| fill | 控件是否填充可用空间。 | “none”(默认)、“x”、“y”、“both” |
| expand | 是否应该扩展以填充任何父容器中未被占用的空间(值为yes或者True时side无效)。 | True 或 False(默认) |
| anchor | (定位点) 控件在指定区域的对齐方式。 | “NW”、“N” 、“NE”、“W”、“CENTER”(默认)、“E”、“SW”、“S”、“SE” |
pack方法布局管理示例
1.默认的排列方式
from tkinter import *
# 创建窗口
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红", bg="red")
lable2 = Label(root, text="黄", bg="yellow")
lable3 = Label(root, text="蓝", bg="blue")
lable4 = Label(root, text="绿", bg="green")
root.title("pack 例子1 默认布局")
lable1.pack()
lable2.pack()
lable3.pack()
lable4.pack()
root.mainloop()
界面效果如下图所示:

2.side参数排列方式
from tkinter import *
# 创建窗口
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红", bg="red")
lable2 = Label(root, text="黄", bg="yellow")
lable3 = Label(root, text="蓝", bg="blue")
lable4 = Label(root, text="绿", bg="green")
root.title("pack 例子2 side")
lable1.pack(side=TOP)
lable2.pack(side=BOTTOM)
lable3.pack(side=LEFT)
lable4.pack(side=RIGHT)
root.mainloop()
界面效果如下图所示:

3.expand和fill布局方式
from tkinter import *
# 创建窗口
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红", bg="red")
lable2 = Label(root, text="黄", bg="yellow")
lable3 = Label(root, text="蓝", bg="blue")
lable4 = Label(root, text="绿", bg="green")
root.title("pack 例子3 expand和fill")
lable1.pack(side=TOP, fill=Y, expand=True)
lable2.pack(side=BOTTOM, fill=Y, expand=True)
lable3.pack(side=LEFT, fill=X, expand=True)
lable4.pack(side=RIGHT, fill=X, expand=True)
root.mainloop()
界面效果如下图所示:

4.anchor参数示例
from tkinter import *
# 创建窗口
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红", bg="red")
lable2 = Label(root, text="黄", bg="yellow")
lable3 = Label(root, text="蓝", bg="blue")
lable4 = Label(root, text="绿", bg="green")
root.title("pack 例子4 anchor")
lable1.pack(anchor=NW)
lable2.pack(anchor=NE)
lable3.pack(anchor=SW)
lable4.pack(anchor=SE)
root.mainloop()
界面效果如下图所示:

5.side加上anchor并列方式
from tkinter import *
# 创建窗口
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红", bg="red")
lable2 = Label(root, text="黄", bg="yellow")
lable3 = Label(root, text="蓝", bg="blue")
lable4 = Label(root, text="绿", bg="green")
root.title("pack 例子5 anchor")
lable1.pack(side=LEFT, anchor=NW)
lable2.pack(side=LEFT, anchor=NE)
lable3.pack(side=LEFT, anchor=SW)
lable4.pack(side=LEFT, anchor=SE)
root.mainloop()
界面效果如下图所示:

6.展示有序间隔排列方式
from tkinter import *
# 创建窗口
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红", bg="red")
lable2 = Label(root, text="黄", bg="yellow")
lable3 = Label(root, text="蓝", bg="blue")
lable4 = Label(root, text="绿", bg="green")
root.title("pack 例子6 间隔")
lable1.pack(padx=20, pady=10, ipadx=10, ipady=5)
lable2.pack(padx=20, pady=10, ipadx=10, ipady=5)
lable3.pack(padx=20, pady=10, ipadx=10, ipady=5)
lable4.pack(padx=20, pady=10, ipadx=10, ipady=5)
root.mainloop()
界面效果如下图所示:

guid()方法
guid方法基于行和列的网格布局管理方式,相对复杂的界面设计会有用
guid()方法的基本语法:
button = tk.Button(root, text="确定", command=test)
button.guid(**options)
guid()方法提供的选项:
| 选项参数 | 参数作用 | 取值范围 |
|---|---|---|
| row | 组件所在行的位置。 | 整数 |
| column | 组件所在列的位置。 | 整数 |
| rowspan | 组件跨越的行数。 | 整数,占用行数的数量 |
| columnspan | 组件跨越的列数。 | 整数,占用列数的数量 |
| sticky | 控件在单元格内的对齐方式。 | 功能类似anchor,但是只可以设定N/S/W/E,即上/下/左/右对齐. sticky=N+S :可以拉长高度让控件在顶端和底端对齐。 sticky=W+E :可以拉长宽度让控件在左边和右边对齐。 sticky=N+S+E :可以拉长高度让控件在顶端和底端对齐,同时切齐右边。 sticky=N+S+W :可以拉长高度让控件在顶端和底端对齐,同时切齐左边。 sticky=N+S+W+E :可以拉长高度让控件在顶端和底端对齐,同时切齐左右边 |
| padx | 参数设置指定组件与容器边缘的水平间距。 | 整数(像素单位) |
| pady | 参数设置指定组件与容器边缘的垂直间距。 | 整数(像素单位) |
| ipadx | 表达内部填充,增加按钮内容与边框的水平距离。 | 整数(像素单位) |
| ipady | 表达内部填充,增加按钮内容与边框的垂直距离。 | 整数(像素单位) |
1.guid默认排列方式
from tkinter import *
# 创建窗口
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红12", bg="red")
lable2 = Label(root, text="黄1234", bg="yellow")
lable3 = Label(root, text="蓝123456", bg="blue")
lable4 = Label(root, text="绿12345678", bg="green")
root.title("grid 例子1 默认布局")
lable1.grid()
lable2.grid()
lable3.grid()
lable4.grid()
root.mainloop()
界面效果如下图所示:

2.指定行列的排列方式
from tkinter import *
# 创建窗口
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红12", bg="red")
lable2 = Label(root, text="黄1234", bg="yellow")
lable3 = Label(root, text="蓝123456", bg="blue")
lable4 = Label(root, text="绿12345678", bg="green")
root.title("grid 例子2 指定行列")
lable1.grid(row=0, column=0)
lable2.grid(row=2, column=0)
lable3.grid(row=3, column=3)
lable4.grid(row=4, column=3)
root.mainloop()
界面效果如下图所示:

3.使用sticky参数排列方式
from tkinter import *
# 创建窗口
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红12", bg="red")
lable2 = Label(root, text="黄1234", bg="yellow")
lable3 = Label(root, text="蓝123456", bg="blue")
lable4 = Label(root, text="绿12345678", bg="green")
root.title("grid 例子3 sticky")
lable1.grid(row=0, column=0, sticky=EW)
lable2.grid(row=2, column=0)
lable3.grid(row=3, column=3, sticky=EW)
lable4.grid(row=4, column=3)
root.mainloop()
界面效果如下图所示:

4.使用columnspan参数的排列方式
from tkinter import *
# 创建窗口
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红12", bg="red")
lable2 = Label(root, text="黄1234", bg="yellow")
lable3 = Label(root, text="蓝123456", bg="blue")
lable4 = Label(root, text="绿12345678", bg="green")
root.title("grid 例子4 columnspan")
lable1.grid(row=0, column=0, sticky=EW)
lable2.grid(row=0, column=1, sticky=EW)
lable3.grid(row=1, column=0, columnspan=2, sticky=EW)
lable4.grid(row=2, column=0, sticky=EW)
root.mainloop()
界面效果如下图所示:

place()方法
place则是提供相对位置和绝对位置的精确控制,也同样适应于复杂的布局管理。
guid()方法的基本语法:
button = tk.Button(root, text="确定", command=test)
button.place(**options)
place()方法提供的选项:
| 选项参数 | 参数作用 | 取值范围 |
|---|---|---|
| x | 组件相对于父级容器的水平偏移量,表示控件的横坐标。 | 整数(像素单位) |
| y | 组件相对于父级容器的垂直偏移量,表示控件的纵坐标。 | 整数(像素单位) |
| width | 组件的宽度。 | 整数(像素单位) |
| height | 组件的高度。 | 整数(像素单位) |
| anchor | (定位点) 控件在指定区域的对齐方式,用于指定组件如何对齐于 (x, y) 点。 | “NW”、“N” 、“NE”、“W”、“CENTER”(默认)、“E”、“SW”、“S”、“SE” |
| relx | 组件的水平位置,相对于父容器的宽度的比例。 | 浮动值,范围 0 到 1 |
| rely | 组件的垂直位置,相对于父容器的高度的比例。 | 浮动值,范围 0 到 1 |
| relwidth | 控件的宽度,相对于父容器宽度的比例。 | 浮动值,范围 0 到 1 |
| relheight | 控件的高度,相对于父容器高度的比例。 | 浮动值,范围 0 到 1 |
相比pack和guid方法来说place太精准了,所以还是pack和guid方法使用起来更加友善。