tk.Label(root, text="第0行第0列").grid(row=0, column=0) # 放置在0行0列
tk.Label(root, text="第1行第1列").grid(row=1, column=1) # 放置在1行1列
grid()
方法核心参数详解row
:指定行号(从0开始)column
:指定列号(从0开始)rowspan
:组件跨越的行数columnspan
:组件跨越的列数sticky
:组件在单元格内的对齐方式(N, S, E, W, NE, NW, SE, SW或组合)padx
:水平方向外边距pady
:垂直方向外边距ipadx
:水平方向内边距ipady
:垂直方向内边距import tkinter as tk
root = tk.Tk()
root.title("grid()布局管理器示例")
root.geometry("400x300")
# 创建标签框架
frame = tk.Frame(root, bd=2, relief=tk.SUNKEN)
frame.pack(pady=20, padx=20, fill=tk.BOTH, expand=True)
# 0行0列 - 左上角
tk.Label(frame,
text="第0行第0列",
bg="lightblue",
font=("Arial", 12),
width=15, height=2
).grid(row=0, column=0, padx=5, pady=5)
# 0行1列 - 右上角
tk.Label(frame,
text="第0行第1列",
bg="lightgreen",
font=("Arial", 12),
width=15, height=2
).grid(row=0, column=1, padx=5, pady=5)
# 1行0列 - 左下角
tk.Label(frame,
text="第1行第0列",
bg="lightyellow",
font=("Arial", 12),
width=15, height=2
).grid(row=1, column=0, padx=5, pady=5)
# 1行1列 - 右下角
tk.Label(frame,
text="第1行第1列",
bg="lightpink",
font=("Arial", 12),
width=15, height=2
).grid(row=1, column=1, padx=5, pady=5)
# 跨越两列的标题
tk.Label(frame,
text="网格布局示例",
bg="gray",
fg="white",
font=("Arial", 14, "bold")
).grid(row=2, column=0, columnspan=2, sticky="ew", pady=(10,5))
# 配置行列权重
frame.grid_rowconfigure(0, weight=1)
frame.grid_rowconfigure(1, weight=1)
frame.grid_columnconfigure(0, weight=1)
frame.grid_columnconfigure(1, weight=1)
root.mainloop()
tk.Label(root, text="用户名:").grid(row=0, column=0)
tk.Entry(root).grid(row=0, column=1)
tk.Label(root, text="密码:").grid(row=1, column=0)
tk.Entry(root, show="*").grid(row=1, column=1)
tk.Label(root, text="标题").grid(row=0, column=0, columnspan=2)
tk.Button(root, text="确定").grid(row=1, column=0)
tk.Button(root, text="取消").grid(row=1, column=1)
tk.Label(root, text="选项1").grid(row=0, column=0, rowspan=2)
tk.Label(root, text="选项2").grid(row=0, column=1)
tk.Label(root, text="选项3").grid(row=1, column=1)
# 配置行列的权重(使组件随窗口缩放)
root.grid_rowconfigure(0, weight=1) # 第0行可扩展
root.grid_columnconfigure(1, weight=1) # 第1列可扩展
# 使用sticky参数控制组件在单元格内的对齐
tk.Label(root, text="西").grid(row=0, column=0, sticky="w")
tk.Label(root, text="东").grid(row=0, column=1, sticky="e")
tk.Label(root, text="居中").grid(row=1, column=0, columnspan=2, sticky="nsew")
# 标签
tk.Label(root, text="用户名:").grid(row=0, column=0, sticky="e", padx=5, pady=5)
tk.Label(root, text="密码:").grid(row=1, column=0, sticky="e", padx=5, pady=5)
tk.Label(root, text="确认密码:").grid(row=2, column=0, sticky="e", padx=5, pady=5)
# 输入框
tk.Entry(root).grid(row=0, column=1, padx=5, pady=5)
tk.Entry(root, show="*").grid(row=1, column=1, padx=5, pady=5)
tk.Entry(root, show="*").grid(row=2, column=1, padx=5, pady=5)
# 按钮
tk.Button(root, text="注册").grid(row=3, column=0, pady=10)
tk.Button(root, text="取消").grid(row=3, column=1, pady=10)
# 配置权重
root.grid_rowconfigure(3, weight=1)
root.grid_columnconfigure(1, weight=1)
Q: grid()
和 pack()
可以混用吗? A: 不可以,同一个父容器内的所有组件必须使用同一种布局管理器(pack()
、grid()
或 place()
)。
Q: 为什么有些单元格大小不一致? A: 默认情况下,网格单元格会根据内容调整大小。可以使用 grid_propagate(False)
禁用自动调整,或使用 grid_rowconfigure()
和 grid_columnconfigure()
设置权重。
Q: 如何让组件填满整个单元格? A: 使用 sticky
参数:
tk.Label(root, text="填满").grid(sticky="nsew") # 四个方向都粘附
Q: 如何创建空白行/列作为间距? A: 有两种方法:
Label
并设置高度/宽度padx
和 pady
参数增加间距Frame
使用 grid()
创建模块化布局grid()
是 tkinter
中最强大的布局管理器,特别适合创建表格形式的规整界面。通过合理使用行列跨度和权重配置,可以实现各种复杂的界面布局。