03 Tkinter布局方式

Tkinter布局方式

Tkinter 提供了三种几何管理类:packgridplace,用于组织和管理组件的布局。

1. 顺序布局(pack

pack 方法通过块的方式组织配件,适用于快速界面设计。它根据组件创建顺序将组件添加到父组件中。

pack 方法的选项

名称描述取值范围
expand控制组件是否填充父组件的剩余空间。"yes", 自然数, "no", 0 (默认值为 "no"0)
fill填充 x(y) 方向上的空间。"x", "y", "both" (默认值为待选)
ipadx组件内部在 x(y) 方向上的填充空间大小。非负浮点数 (默认值为0.0)
ipady组件内部在 y 方向上的填充空间大小。非负浮点数 (默认值为0.0)
padx组件外部在 x 方向上的填充空间大小。非负浮点数 (默认值为0.0)
pady组件外部在 y 方向上的填充空间大小。非负浮点数 (默认值为0.0)
side定义组件停靠在父组件的哪一边。"top", "bottom", "left", "right" (默认为 "top")
before将组件在所选组件之前 pack已经 pack 后的组件对象
after将组件在所选组件之后 pack已经 pack 后的组件对象
in_将组件作为所选组件的子组件。已经 pack 后的组件对象
anchor对齐方式,如左对齐"w",右对齐"e",顶对齐"n",底对齐"s""n", "s", "w", "e", "nw", "sw", "se", "ne", "center" (默认为"center")

2. 完整代码

# 导入tkinter模块,用于创建GUI应用程序
import tkinter as tk

# 创建Tkinter的主窗口实例
root = tk.Tk()
root.geometry("300x200")   # 设置窗口大小为300x200

# 创建三个标签
label1 = tk.Label(root, text="Label 1", bg="red", fg="white")   # 创建标签1,背景色为红色,前景色为白色
label2 = tk.Label(root, text="Label 2", bg="green", fg="black")   # 创建标签2,背景色为绿色,前景色为黑色
label3 = tk.Label(root, text="Label 3", bg="blue", fg="white")   # 创建标签3,背景色为蓝色,前景色为白色

# 使用pack布局管理器进行布局
# 默认top方式排列,无额外设置,标签1将显示在窗口顶部
label1.pack()
# 左对齐,外边距为10像素,标签2将显示在窗口左侧,并且左右各增加10像素的外边距
label2.pack(side=tk.LEFT, padx=10, pady=10)
# 右对齐,填充剩余空间,标签3将显示在窗口右侧,并且在水平和垂直方向上扩展以填充任何额外空间
label3.pack(side=tk.RIGHT, expand=True, fill=tk.BOTH)

# 进入主事件循环,等待用户操作
root.mainloop()

在这里插入图片描述

2. 网格布局(grid

grid 布局通过行和列来组织组件,适用于需要精确控制组件位置的布局。

grid 方法的选项

名称描述取值范围
row指定组件所在的行。自然数
column指定组件所在的列。自然数
rowspan组件跨越的行数。自然数
columnspan组件跨越的列数。自然数
sticky控制组件在单元格中的对齐方式。"n", "s", "w", "e", "nw", "sw", "se", "ne", "center" (默认为"center")

完整代码

# 导入tkinter模块,用于创建GUI应用程序
import tkinter as tk

# 创建Tkinter的主窗口实例
root = tk.Tk()
root.geometry("300x115")  # 设置窗口大小为300x115
root.resizable(False, False)  # 禁止窗口大小调整

# 假设我们有一个学生信息的列表
students = [
    ("2023001", "张三", 90, 85),
    ("2023002", "李四", 88, 88),
    ("2023003", "王五", 92, 87),
    ("2023004", "赵六", 85, 90),
]

# 创建表格中的单元格
# 第一行(表头)
cell1 = tk.Label(root, text="学号", bg="white", width=10)  # 创建一个标签,显示文本“学号”,背景色为白色,宽度为10
cell2 = tk.Label(root, text="姓名", bg="white", width=10)  # 创建一个标签,显示文本“姓名”,背景色为白色,宽度为10
cell3 = tk.Label(root, text="数学成绩", bg="white", width=10)  # 创建一个标签,显示文本“数学成绩”,背景色为白色,宽度为10
cell4 = tk.Label(root, text="语文成绩", bg="white", width=10)  # 创建一个标签,显示文本“语文成绩”,背景色为白色,宽度为10

cell1.grid(row=0, column=0, sticky="nsew")  # 将cell1放置在网格的第0行第0列,使其在北、南、东、西方向上拉伸
cell2.grid(row=0, column=1, sticky="nsew")  # 将cell2放置在网格的第0行第1列,使其在北、南、东、西方向上拉伸
cell3.grid(row=0, column=2, sticky="nsew")  # 将cell3放置在网格的第0行第2列,使其在北、南、东、西方向上拉伸
cell4.grid(row=0, column=3, sticky="nsew")  # 将cell4放置在网格的第0行第3列,使其在北、南、东、西方向上拉伸

# 循环创建学生信息行
for i, (student_id, name, math_score, chinese_score) in enumerate(students):
    cell5 = tk.Label(root, text=student_id, bg="white", width=10)  # 创建一个标签显示学生学号
    cell6 = tk.Label(root, text=name, bg="white", width=10)  # 创建一个标签显示学生姓名
    cell7 = tk.Label(root, text=str(math_score), bg="white", width=10)  # 创建一个标签显示学生数学成绩
    cell8 = tk.Label(root, text=str(chinese_score), bg="white", width=10)  # 创建一个标签显示学生语文成绩

    cell5.grid(row=i + 1, column=0, sticky="nsew")  # 将cell5放置在网格的第i+1行第0列,使其在北、南、东、西方向上拉伸
    cell6.grid(row=i + 1, column=1, sticky="nsew")  # 将cell6放置在网格的第i+1行第1列,使其在北、南、东、西方向上拉伸

    # 当i为2时,数学成绩跨列显示
    if i == 2:
        cell7.grid(row=i + 1, column=2, columnspan=2, sticky="nsew")  # cell7跨两列,放置在第i+1行第2列和第3列
    else:
        cell7.grid(row=i + 1, column=2, sticky="nsew")  # cell7正常放置在第i+1行第2列
        cell8.grid(row=i + 1, column=3, sticky="nsew")  # cell8正常放置在第i+1行第3列

# 进入主事件循环
root.mainloop()

在这里插入图片描述

3. 精确定位布局(place

place 布局允许程序员指定组件的大小和位置。

place 方法的选项

名称描述取值范围
x组件左上角的 x 坐标。自然数
y组件左上角的 y 坐标。自然数
width组件的宽度。自然数
height组件的高度。自然数
# 导入tkinter模块,用于创建GUI应用程序
import tkinter as tk

# 创建Tkinter的主窗口实例
root = tk.Tk()
# 设置窗口大小为400x150,并指定窗口在屏幕上的位置为(100, 100)
root.geometry('400x150+100+100')
# 设置窗口标题为"登录界面"
root.title("登录界面") 

# 创建标签和输入框
# 创建一个标签,显示文本“用户名:”
username_label = tk.Label(root, text="用户名:")  
# 使用place布局管理器,将标签放置在窗口的(100, 20)位置
username_label.place(x=100, y=20) 

# 创建一个文本输入框,用于输入用户名
username_entry = tk.Entry(root)  
# 将输入框放置在窗口的(150, 20)位置,宽度为200
username_entry.place(x=150, y=20, width=200)  

# 创建一个标签,显示文本“密码:”
password_label = tk.Label(root, text="密码:") 
# 使用place布局管理器,将标签放置在窗口的(100, 60)位置
password_label.place(x=100, y=60)  

# 创建一个文本输入框,用于输入密码,输入时显示为星号(*)
password_entry = tk.Entry(root, show="*")  
# 将输入框放置在窗口的(150, 60)位置,宽度为200
password_entry.place(x=150, y=60, width=200)  

# 创建重置密码按钮,点击时打印提示信息
reset_button = tk.Button(root, text="重置密码", command=lambda: print("重置密码功能尚未实现"))
# 使用place布局管理器,将按钮放置在窗口的(145, 100)位置,宽度为100
reset_button.place(x=145, y=100, width=100)

# 创建登录按钮,点击时打印提示信息
login_button = tk.Button(root, text="登录", command=lambda: print("登录功能尚未实现"))
# 使用place布局管理器,将按钮放置在窗口的(250, 100)位置,宽度为100
login_button.place(x=250, y=100, width=100)

# 进入主事件循环
root.mainloop()  # 启动Tkinter的主事件循环,等待用户操作

在这里插入图片描述

5. 总结

在Tkinter中,packgridplace是三种不同的布局管理器,它们用于控制组件在窗口中的位置和大小。每种布局管理器都有其特点和适用场景:

pack

  • 特点pack布局管理器通过将组件“打包”到窗口中来自动管理组件的位置。它根据组件添加的顺序,将它们放置在窗口的上、下、左、右或中心。
  • 适用场景:当需要快速布局且组件顺序较为固定时,pack是一个简单方便的选择。它适合于简单的布局需求,尤其是当组件的排列顺序和大小不是特别重要时。

grid

  • 特点grid布局管理器将窗口划分为行和列,组件可以放置在这些行和列的交叉点上。通过指定行和列,可以精确控制组件的位置。
  • 适用场景:当需要创建表格形式的布局时,grid非常有用。它适合于需要精确控制组件位置和大小的复杂布局,尤其是当布局需要跨行或跨列时。

place

  • 特点place布局管理器允许你通过指定组件的绝对位置(x和y坐标)和大小来放置组件。这种方式提供了最大的灵活性,但需要手动计算每个组件的位置。
  • 适用场景:当需要对组件的位置进行精细控制,或者布局较为固定且不依赖于窗口大小变化时,place是一个好选择。它适合于需要精确控制组件位置和大小的复杂布局。

使用pack的案例

假设你正在创建一个简单的聊天应用界面,界面包含一个消息输入框和一个发送按钮。界面的布局不需要特别复杂,组件的顺序和大小不是关键因素。

import tkinter as tk

root = tk.Tk()
root.title("简单聊天应用")

message_entry = tk.Entry(root)
message_entry.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

send_button = tk.Button(root, text="发送")
send_button.pack(side=tk.RIGHT)

root.mainloop()

在这个案例中,pack布局管理器通过side参数简单地将输入框和按钮放置在窗口的左右两侧。

使用grid的案例

假设你正在设计一个复杂的表单界面,包含多个输入字段和标签,这些字段需要按照特定的行和列排列。

import tkinter as tk

root = tk.Tk()
root.title("复杂表单界面")

labels = ["姓名", "年龄", "邮箱"]
entries = [tk.Entry(root) for _ in range(3)]

for i, label_text in enumerate(labels):
    tk.Label(root, text=label_text).grid(row=i, column=0, sticky="e")
    entries[i].grid(row=i, column=1, sticky="ew")

root.mainloop()

在这个案例中,grid布局管理器通过指定rowcolumn参数,将标签和输入框整齐地排列在网格中。

使用place的案例

假设你正在创建一个具有特定设计要求的界面,比如一个工具栏,其中的按钮需要精确地放置在特定的位置。

import tkinter as tk

root = tk.Tk()
root.title("工具栏界面")

button1 = tk.Button(root, text="保存")
button2 = tk.Button(root, text="打开")
button3 = tk.Button(root, text="退出")

button1.place(x=10, y=10)
button2.place(x=60, y=10)
button3.place(x=110, y=10)

root.mainloop()

在这个案例中,place布局管理器允许你精确地控制每个按钮的位置,以满足特定的设计要求。

总体来说

  • 简单布局:使用pack,适合组件顺序固定且布局简单的场景。
  • 复杂表格布局:使用grid,适合需要精确控制行和列的复杂布局。
  • 精细控制位置:使用place,适合需要精确控制组件位置和大小的复杂布局。
  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值