Python Tkinter grid表格布局

介绍

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()   # #窗口持久化

原文出处:/show_1IX65ILjBw3t.html