Tkinter 的 grid()
参数分为 基础定位、扩展布局 和 样式控制 三类,通过具体代码示例展示每个参数的效果(单独使用和组合使用)。
row
和 column
作用:定义部件在网格中的行和列位置(从0开始)。
import tkinter as tk
root = tk.Tk()
tk.Label(root, text="(0,0)").grid(row=0, column=0) # 第1行第1列
tk.Label(root, text="(1,1)").grid(row=1, column=1) # 第2行第2列
root.mainloop()
效果:
┌────────┬────────┐
│ (0,0) │ │
├────────┼────────┤
│ │ (1,1) │
└────────┴────────┘
rowspan
和 columnspan
作用:让部件跨多行/多列。
tk.Label(root, text="跨2列", bg="cyan").grid(row=0, column=0, columnspan=2)
tk.Label(root, text="跨2行", bg="yellow").grid(row=1, column=0, rowspan=2)
效果:
┌───────────────┐
│ 跨2列 │ # 跨第0行的两列
├───────┬───────┤
│ 跨2行 │ │ # 跨第1-2行的第0列
│ │ │
└───────┴───────┘
sticky
作用:控制部件在网格单元格内的对齐和拉伸方向("n"
北/上, "s"
南/下, "e"
东/右, "w"
西/左)。
tk.Label(root, text="靠左", bg="pink").grid(row=0, column=0, sticky="w")
tk.Label(root, text="靠右", bg="lightgreen").grid(row=1, column=0, sticky="e")
tk.Label(root, text="拉伸", bg="orange").grid(row=2, column=0, sticky="nsew")
效果:
┌─────────────────┐
│靠左 │ # 左对齐
├─────────────────┤
│ 靠右 │ # 右对齐
├─────────────────┤
│█████████████████│ # 拉伸填满(用█示意)
└─────────────────┘
padx
和 pady
作用:设置部件外部间距(像素)。
tk.Label(root, text="上下间距", bg="lightblue").grid(row=0, column=0, pady=20)
tk.Label(root, text="左右间距", bg="salmon").grid(row=1, column=0, padx=30)
效果:
┌─────────────────┐
│ │ # 上方20像素空白
│ 上下间距 │
│ │ # 下方20像素空白
├─────────────────┤
│ 左右间距 │ # 左右各30像素空白
└─────────────────┘
ipadx
和 ipady
作用:设置部件内部间距(像素)。
tk.Label(root, text="内部扩展", bg="gold").grid(row=0, column=0, ipadx=20, ipady=10)
效果:
┌───────────────────────────┐
│ │
│ 内部扩展 │ # 文本周围扩展了空间
│ │
└───────────────────────────┘
import tkinter as tk
root = tk.Tk()
root.title("登录界面")
# 配置行列权重(让第1列可拉伸)
root.columnconfigure(1, weight=1)
# 用户名行
tk.Label(root, text="用户名:").grid(row=0, column=0, sticky="e", padx=5, pady=5)
tk.Entry(root).grid(row=0, column=1, sticky="ew", padx=5, pady=5)
# 密码行
tk.Label(root, text="密码:").grid(row=1, column=0, sticky="e", padx=5, pady=5)
tk.Entry(root, show="*").grid(row=1, column=1, sticky="ew", padx=5, pady=5)
# 登录按钮(跨2列+拉伸)
tk.Button(root, text="登录", bg="lightgreen").grid(
row=2, column=0, columnspan=2, sticky="ew", padx=5, pady=10, ipady=5
)
root.mainloop()
效果:
┌───────────────────────────┐
│ 用户名: ████████████████ │ # 输入框水平拉伸
├───────────────────────────┤
│ 密码: ████████████████ │
├───────────────────────────┤
│ █████ 登录 ███████ │ # 按钮水平拉伸+内部间距
└───────────────────────────┘
# 让所有列等宽
for col in range(3):
root.columnconfigure(col, weight=1)
# 让所有行等高
for row in range(3):
root.rowconfigure(row, weight=1)
row
和 column
冲突columnspan
不要超出总列数)widget.grid_remove() # 隐藏但保留布局信息
widget.grid() # 重新显示
掌握这些参数组合后,你可以轻松实现任何复杂的网格布局!