介绍
grid() 是 Tkinter 中最灵活、应用最广泛的布局管理器,它采用表格(网格)方式排列组件,通过行和列的坐标来精确定位组件位置,非常适合创建复杂的表单、数据表格或多元素界面。
适用场景
- 表单类界面(如登录框、注册页面)
- 数据表格展示
- 多元素、多列布局
- 需要精确控制组件位置的复杂界面
相比 pack() 的线性布局和 place() 的绝对定位,grid() 在灵活性和易用性之间取得了很好的平衡,是大多数 Tkinter 应用的首选布局方式。
核心概念
- 网格(Grid):由行(row)和列(column)组成的虚拟表格
- 单元格(Cell):行和列的交叉点,每个单元格可放置一个组件
- 行号和列号:均从 0 开始计数
- 跨行列:组件可以跨越多个行或列(类似 HTML 的 colspan/rowspan)
grid()方法常用参数
| 参数 | 说明 |
|---|---|
row |
组件所在行(整数,从 0 开始) |
column |
组件所在列(整数,从 0 开始) |
rowspan |
组件跨越的行数(默认 1) |
columnspan |
组件跨越的列数(默认 1) |
sticky |
组件在单元格中的对齐方式(N/S/E/W 及组合,如:tk.EW(表示宽度随窗口改变)、tk.NSEW(宽度、高度随窗口改变) 等) |
padx |
组件左右的外部间距(像素) |
pady |
组件上下的外部间距(像素) |
ipadx |
组件内部的水平间距(像素) |
ipady |
组件内部的垂直间距(像素) |
权重
weight:行或列的权重(通过grid_rowconfigure/grid_columnconfigure 设置)
实现登录窗口
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("登录")
root.geometry("300x200")
# 配置列和行的权重,使它们能随窗口大小变化而调整
root.grid_columnconfigure(0, weight=1)
root.grid_columnconfigure(1, weight=3)
root.grid_rowconfigure(3, weight=1)
# 用户名标签和输入框
tk.Label(root, text="用户名:").grid(
row=0, column=0, padx=5, pady=5, sticky=tk.W
)
tk.Entry(root).grid(
row=0, column=1, padx=5, pady=5, sticky=tk.EW
)
# 密码标签和输入框
tk.Label(root, text="密码:").grid(
row=1, column=0, padx=5, pady=5, sticky=tk.W
)
tk.Entry(root, show="*").grid(
row=1, column=1, padx=5, pady=5, sticky=tk.EW
)
# 记住密码复选框(跨列显示)
tk.Checkbutton(root, text="记住密码").grid(
row=2, column=0, columnspan=2, padx=5, pady=5, sticky=tk.W
)
# 登录按钮(跨列居中显示)
tk.Button(root, text="登录").grid(
row=3, column=0, columnspan=2, pady=10
)
root.mainloop()
解释
1. 响应式布局(权重配置)
通过 grid_rowconfigure() 和 grid_columnconfigure() 方法设置行和列的权重,使界面能够响应窗口大小变化:
# 第0列权重为1,第1列权重为2,比例为1:2
root.grid_columnconfigure(0, weight=1)
root.grid_columnconfigure(1, weight=2)
# 第2行可以拉伸
root.grid_rowconfigure(3, weight=1)
2. 组件对齐(sticky 参数)
grid() 的 sticky 参数控制组件在单元格中的对齐方式,可使用以下值:
N(北,上)、S(南,下)、E(东,右)、W(西,左)- 组合值:
NW(左上)、NE(右上)、SW(左下)、SE(右下)、EW(水平拉伸)、NS(垂直拉伸)、NSEW(双向拉伸)
3. 跨行列布局
使用 rowspan 和 columnspan 实现组件跨多行或多列:
# 跨越2行1列
tk.Button(root, text="跨2行").grid(row=0, column=0, rowspan=2)
# 跨越1行2列
tk.Button(root, text="跨2列").grid(row=2, column=0, columnspan=2)
4. 嵌套布局
可以在 Frame 组件中使用 grid(),实现复杂的嵌套布局:
# 创建一个框架并使用grid布局
frame = tk.Frame(root, bd=2, relief=tk.SUNKEN)
frame.grid(row=0, column=0, padx=10, pady=10)
# 在框架内部也使用grid布局
tk.Label(frame, text="框架内标签").grid(row=0, column=0)
tk.Button(frame, text="框架内按钮").grid(row=1, column=0)
简单例子
import tkinter as tk
win = tk.Tk()
win.title("Kahn Software v1") # 窗口标题
win.geometry("600x400+200+20") # 600宽、400高,窗口位置x坐标是200,y坐标是20
'''
相对布局,窗体改变对空间有影响
一般控件要指定宽度,否则不等宽
注意:控件不要调用 .pack()
'''
label1 = tk.Label(win, text="李雷", bg="pink",width=20)
label2 = tk.Label(win, text="韩梅梅", bg="yellow",width=20)
label3 = tk.Label(win, text="lucy", bg="red",width=20)
label4 = tk.Label(win, text="lili", bg="green",width=20)
label1.grid(row=0, column=0)
label2.grid(row=0, column=1)
label3.grid(row=1, column=0)
label4.grid(row=1, column=1)
win.mainloop() # #窗口持久化

