<think>我们被要求展示使用pack几何布局管理器的GUI程序示例及其运行效果。pack布局管理器是Tkinter中三种几何管理器之一,它通过将控件放置在父控件的一侧(如top,bottom,left,right)来排列控件,并允许控件在容器中填充。我们将创建一个简单的GUI,包含多个使用pack布局的控件,并解释pack的常用选项(如side,fill,expand,padx,pady等)如何影响布局。示例代码将包括以下控件:1.顶部放置一个标签(side='top')2.左侧放置一个按钮(side='left')3.右侧放置两个标签(side='right',注意pack顺序会影响排列)4.底部放置一个复选框(side='bottom')5.中间放置一个文本框,并让它填充剩余空间(fill='both',expand=True)同时,我们将为按钮和复选框绑定一些简单的事件处理函数。注意:pack布局管理器是按照控件被pack的顺序来排列的,因此控件的添加顺序很重要。代码示例:</think>### 使用 pack 几何布局管理器的 GUI 程序示例
以下是一个使用 Tkinter 的 `pack()` 几何布局管理器创建 GUI 的完整示例,展示了不同控件如何通过 `pack()` 排列及其运行效果:
```python
import tkinter as tk
def toggle_dark_mode():
"""切换深色/浅色模式"""
current_bg = root.cget("bg")
new_bg = "#2d2d2d" if current_bg == "white" else "white"
new_fg = "white" if new_bg == "#2d2d2d" else "black"
root.config(bg=new_bg)
status_label.config(bg=new_bg, fg=new_fg)
frame1.config(bg=new_bg)
frame2.config(bg=new_bg)
for widget in root.winfo_children():
if isinstance(widget, (tk.Label, tk.Button, tk.Checkbutton)):
widget.config(bg=new_bg, fg=new_fg)
def update_status():
"""更新状态标签"""
name = name_entry.get() or "访客"
status_label.config(text=f"欢迎, {name}! 您选择了: {', '.join(selected_options)}")
def on_checkbox_change():
"""处理复选框变化"""
global selected_options
selected_options = [text for var, text in zip(check_vars, options) if var.get() == 1]
update_status()
# 主窗口设置
root = tk.Tk()
root.title("Pack 布局管理器示例")
root.geometry("500x400")
root.config(bg="white")
# 全局变量
options = ["Python 编程", "数据可视化", "机器学习", "Web 开发"]
selected_options = []
check_vars = [tk.IntVar() for _ in options]
# ===== 使用 pack() 布局 =====
# 顶部标题
title_label = tk.Label(
root,
text="Tkinter Pack 布局管理器演示",
font=("Arial", 16, "bold"),
bg="white",
fg="#333"
)
title_label.pack(pady=15, fill="x")
# 分隔线
separator = tk.Frame(root, height=2, bg="#e0e0e0")
separator.pack(fill="x", pady=5)
# 主内容区域 - 使用框架组织
main_frame = tk.Frame(root, bg="white")
main_frame.pack(fill="both", expand=True, padx=20, pady=10)
# 左侧输入区域 (frame1)
frame1 = tk.Frame(main_frame, bg="white")
frame1.pack(side="left", fill="both", expand=True, padx=10)
tk.Label(frame1, text="姓名:", bg="white", fg="#333").pack(anchor="w", pady=5)
name_entry = tk.Entry(frame1, width=20)
name_entry.pack(fill="x", pady=5)
tk.Label(frame1, text="选择兴趣领域:", bg="white", fg="#333").pack(anchor="w", pady=(15, 5))
# 创建复选框
for i, option in enumerate(options):
cb = tk.Checkbutton(
frame1,
text=option,
variable=check_vars[i],
command=on_checkbox_change,
bg="white",
fg="#333",
anchor="w"
)
cb.pack(fill="x", pady=2)
# 右侧信息区域 (frame2)
frame2 = tk.Frame(main_frame, bg="white")
frame2.pack(side="right", fill="both", expand=True, padx=10)
tk.Label(frame2, text="布局说明:", bg="white", fg="#333", font=("Arial", 10, "bold")).pack(anchor="w")
info_text = """• pack() 按添加顺序排列控件
• side 参数控制排列方向
- left/right: 水平排列
- top/bottom: 垂直排列
• fill 参数控制填充方式
- x: 水平填充
- y: 垂直填充
- both: 双向填充
• expand 允许控件扩展
• padx/pady 添加间距"""
tk.Label(frame2, text=info_text, justify="left", bg="white", fg="#555").pack(anchor="w", pady=10)
# 底部状态栏
status_frame = tk.Frame(root, bg="#f0f0f0", height=30)
status_frame.pack(side="bottom", fill="x")
status_label = tk.Label(
status_frame,
text="准备就绪...",
bg="#f0f0f0",
fg="#333"
)
status_label.pack(side="left", padx=10)
# 控制按钮
button_frame = tk.Frame(root, bg="white")
button_frame.pack(side="bottom", fill="x", pady=10)
tk.Button(
button_frame,
text="更新状态",
command=update_status,
bg="#4CAF50",
fg="white"
).pack(side="left", padx=10)
tk.Button(
button_frame,
text="深色/浅色模式",
command=toggle_dark_mode,
bg="#2196F3",
fg="white"
).pack(side="left", padx=10)
tk.Button(
button_frame,
text="退出",
command=root.destroy,
bg="#f44336",
fg="white"
).pack(side="right", padx=10)
root.mainloop()
```
### 运行效果说明
1. **整体布局结构**:
- 顶部标题栏:使用 `pack(pady=15, fill="x")` 水平填充
- 主内容区:分为左右两个框架,使用 `side="left"` 和 `side="right"`
- 底部状态栏和控制按钮:使用 `side="bottom"`
2. **控件排列特点**:
- 垂直排列:未指定 `side` 时默认垂直排列(如复选框)
- 水平排列:使用 `side="left"` 或 `side="right"`(如按钮)
- 填充空间:`fill="x"` 使控件水平填充可用空间(如输入框)
- 间距控制:`padx` 和 `pady` 添加水平和垂直间距
3. **交互功能**:
- 复选框选择:动态更新状态栏显示
- 深色/浅色模式:演示动态修改界面样式
- 更新按钮:刷新状态信息
4. **布局优势**:
- 简单直观:只需指定排列方向
- 自动调整:窗口大小变化时自动重新排列
- 嵌套支持:框架内可再使用 pack 布局
### pack() 常用参数总结
| **参数** | **说明** | **示例** |
|----------|----------|----------|
| `side` | 排列方向:`top`, `bottom`, `left`, `right` | `.pack(side="left")` |
| `fill` | 填充方式:`x`, `y`, `both` | `.pack(fill="x")` |
| `expand` | 是否扩展:`True`/`False` | `.pack(expand=True)` |
| `padx`/`pady` | 水平和垂直间距 | `.pack(padx=10, pady=5)` |
| `anchor` | 锚点位置:`n`, `s`, `e`, `w`, `center` 等 | `.pack(anchor="w")` |
> **最佳实践**:对于简单界面,pack 是最便捷的选择;复杂布局建议结合 Frame 容器分层管理[^3]。pack 按添加顺序排列控件,这种"先到先得"的特性使其特别适合线性布局[^4]。