Python之tkinter 窗口控件配置管理员之pack方法

本文详细介绍了Python GUI库Tkinter中的pack布局管理器的使用方法,包括side、padx/pady、ipadx/ipady、anchor、fill和expand等参数的解释及示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

在设计GUI程序时,可以使用三种方法包装和定位各组件在容器窗口内的位置
这三种方法又称窗口控件配置管理员(Widget Layout Manager)

  • pack 方法
  • grid 方法
  • place 方法
pack 方法

虽然我们称pack方法,其实是在tkinter内这是一个类别。这是最常使用的控件配置管理方法,它是使用相对位置的概念处理Widget控件配置,至于控件的正确位置,则是由pack 方法自动完成。

pack 方法的语法格式:

pack(options, ...)

它的参数有 sidefillpadx/padyipadx/ipadyanchor

side参数

side参数可以垂直或水平配置控件

例子

import tkinter

# 创建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue")
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen")
label1.pack()
label2.pack()
label3.pack()

root.mainloop()

运行结果:
在这里插入图片描述
当窗口中有多个组件时,使用pack可以让组件由上往下排列显示,这其实也是系统的默认设置。

使用pack方法时,也可以增加side参数设置组件的排列方式,参数如下:

  • TOP:这是默认值,由上往下排列
  • BOTTOM:由下往上排列
  • LEFT:由左往右排列
  • RIGHT:由右往左排列

例子:使用从下往上排列

label1.pack(side=tkinter.BOTTOM)
label2.pack(side=tkinter.BOTTOM)
label3.pack(side=tkinter.BOTTOM)

运行结果:
在这里插入图片描述
例子:从左往右排列

label1.pack(side=tkinter.LEFT)
label2.pack(side=tkinter.LEFT)
label3.pack(side=tkinter.LEFT)

运行结果:
在这里插入图片描述

例子:从右往左排列

label1.pack(side=tkinter.RIGHT)
label2.pack(side=tkinter.RIGHT)
label3.pack(side=tkinter.RIGHT)

运行结果:
在这里插入图片描述
例子:重新设计side,使之成三角状

import tkinter

# 创建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow",
                       width=10)
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue",
                       width=10)
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen",
                       width=10)
label1.pack()
label2.pack(side=tkinter.LEFT)
label3.pack(side=tkinter.RIGHT)

root.mainloop()

运行结果:
在这里插入图片描述
例子:列出relief的全部属性

import tkinter

Reliefs = ["flat", "groove", "raised", "ridge", "solid", "sunken"]
# 创建主窗口
root = tkinter.Tk()

for Relief in Reliefs:
    tkinter.Label(root, text=Relief, relief=Relief,
                  fg="blue").pack(side=tkinter.LEFT, padx=5)

root.mainloop()

运行结果:
在这里插入图片描述

例子:列出所有bitmaps位图

import tkinter

bitMaps = ["error", "hourglass", "info", "questhead", "question", "warning", "gray12", "gray25", "gray50", "gray75"]
# 创建主窗口
root = tkinter.Tk()

for bitmaps in bitMaps:
    tkinter.Label(root, bitmap=bitmaps).pack(side=tkinter.LEFT, padx=5)

root.mainloop()

运行结果:
在这里插入图片描述

padx/pady参数

在使用pack方法时,可以使用padx/pady参数设定控件边界与容器(可想成窗口边界)的距离或是控件边界间的距离。

在默认环境下,窗口控件间的距离是1像素。如果希望有适度间距,可以设置参数padx/pady,代表水平间距/垂直间距

例子:在Two上下增加10像素间距

import tkinter

# 创建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue")
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen")
label1.pack(fill=tkinter.X)
label2.pack(pady=10)
label3.pack(fill=tkinter.X)

root.mainloop()

运行结果:
在这里插入图片描述
结果很明显,就是Two(label2)上下各有10像素

例子:在One上下增加10像素间距

label1.pack(fill=tkinter.X, pady=10)
label2.pack(pady=10)
label3.pack(fill=tkinter.X)

运行结果:
在这里插入图片描述
OneTwo 中间是两个10像素,所以是20像素

例子:标签宽度为10像素,左右边界与容器边界是30像素

import tkinter

# 创建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow",
                       width=10)
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue",
                       width=10)
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen",
                       width=10)
label1.pack(padx=30)
label2.pack(padx=30)
label3.pack(padx=30)

root.mainloop()

运行结果:
在这里插入图片描述
例子:使三个标签横向排列,Two 的左右边界为10像素

import tkinter

# 创建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow",
                       width=10)
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue",
                       width=10)
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen",
                       width=10)
label1.pack(side=tkinter.LEFT)
label2.pack(side=tkinter.LEFT, padx=10)
label3.pack(side=tkinter.LEFT)

root.mainloop()

运行结果:
在这里插入图片描述

ipadx/ipady参数

ipadx参数可以控制标签文字与标签容器的X轴间距,ipady参数可以控制标签文字与标签容器的Y轴间距

例子:让Two标签的X轴间距是20

import tkinter

# 创建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue")
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen")
label1.pack()
label2.pack(ipadx=10)
label3.pack()

root.mainloop()

运行结果:
在这里插入图片描述
例子:让Two标签的Y轴间距是20

import tkinter

# 创建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue")
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen")
label1.pack()
label2.pack(ipady=10)
label3.pack()

root.mainloop()

运行结果:
在这里插入图片描述

padx参数与ipadx参数的区别
  • padx:是指标签的小框框窗口的距离,或者是与其他小框框的距离
  • ipadx:是指标签内部的文字小框框的距离
anchor参数

这个参数可以设定Widget控件在窗口中的位置,但是在这里是指控件内容在控件区域的位置设置

其实就是标签文字在标签区域的位置

例子:在窗口右下方建立一个内容为“One”的标签,其中标签与窗口右边和下边的间距为10像素

import tkinter

# 创建主窗口
root = tkinter.Tk()
root.geometry("300x200")

label1 = tkinter.Label(root, text="One",
                      bg="lightgreen", width=8, height=2)
label1.pack(anchor=tkinter.S, side=tkinter.RIGHT, padx=10, pady=10)

root.mainloop()

运行结果:
在这里插入图片描述
例子:在窗口正下方建立一个内容为“One”的标签,其中标签与窗口右边和下边的间距为10像素

import tkinter

# 创建主窗口
root = tkinter.Tk()
root.geometry("300x200")

label1 = tkinter.Label(root, text="One",
                      bg="lightgreen", width=8, height=2)
label1.pack(anchor=tkinter.S, side=tkinter.BOTTOM, padx=10, pady=10)

root.mainloop()

运行结果:
在这里插入图片描述

例子:增加一个标签,使两个标签在右下方一次排开

import tkinter

# 创建主窗口
root = tkinter.Tk()
root.geometry("300x200")

label1 = tkinter.Label(root, text="One",
                      bg="lightgreen", width=8, height=2)
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue", width=8, height=2)
label1.pack(anchor=tkinter.S, side=tkinter.RIGHT, padx=10, pady=10)
label2.pack(anchor=tkinter.S, side=tkinter.RIGHT, pady=10)

root.mainloop()

运行结果:
在这里插入图片描述

fill参数

fill 参数的主要功能是告诉 pack管理程序,设置控件填满所分配容器区间的方式

参数:

  • fill = X:表示控件可以填满所分配空间的X轴不留白
  • fill = Y:表示控件可以填满所分配空间的Y轴不留白
  • fill = BOTH:表示控件可以填满所分配空间的X轴和Y轴
  • fill默认值为NONE,表示保持原大小

例子:是第1个标签和第3个标签内增加fill = X 参数

import tkinter

# 创建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue")
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen")
label1.pack(fill=tkinter.X)
label2.pack()
label3.pack(fill=tkinter.X)

root.mainloop()

运行结果:
在这里插入图片描述
由此可见,第一栏和第三栏已被填充满

如果所分配容器区间已经满了,则使用此fill参数将不会有任何作用。

fill参数在使用上能有些复杂,建议使用后续的grid方法

例子:验证如果所分配的容器区间已经满了,则使用此fill参数将不会有任何作用

label1.pack(fill=tkinter.X)
label2.pack(fill=tkinter.Y)
label3.pack(fill=tkinter.X)

运行结果:
在这里插入图片描述
一模一样

下面我们来使用fill = BOTH使它全部填充

import tkinter

# 创建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue")
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen")
label1.pack(fill=tkinter.BOTH, side=tkinter.LEFT)
label2.pack(fill=tkinter.Y)
label3.pack(fill=tkinter.BOTH)

root.mainloop()

运行结果:
在这里插入图片描述
我们发现,本来BOTH是填充X轴Y轴的,但是Three的Y轴并没有被填充

这是为什么呢?当扩充窗口大小时,Three在Y轴的空间称为额外空间,这时需要借助一个叫expand的参数

expand参数

expand 参数可设定Widget控件是否填额外的父容器空间

  • 默认是False(或是0),表示不填满
  • 如果是True(或是1),表示填满

例子

import tkinter

# 创建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue")
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen")
label1.pack(fill=tkinter.BOTH, side=tkinter.LEFT)
label2.pack(fill=tkinter.X)
label3.pack(fill=tkinter.BOTH, expand=1)

root.mainloop()

运行结果:
在这里插入图片描述

pack 的方法

pack 其实在Python tkinter中是一个类别,他提供下列方法供我们使用

方法名称说明
slaves()传回所有Widget控件对象
info()传回pack选项的对应值
forget()隐藏Widget控件,可以用pack(option,…)复原实现
location(x,y)传回此点是否在单元格,如果是传回坐标,如果不是传回(-1,-1)
size()传回Widget控件大小。
propagate()参数是True表示副父口大小由子控件决定,默认为True

例子:列出执行前后Widget控件中的内容

import tkinter

# 创建主窗口
root = tkinter.Tk()
print("执行前", root.pack_slaves())
label1 = tkinter.Label(root, text="One",
                      bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue")
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen")
label1.pack(fill=tkinter.BOTH, side=tkinter.LEFT)
label2.pack(fill=tkinter.X)
label3.pack(fill=tkinter.BOTH, expand=1)
print("执行前", root.pack_slaves())
root.mainloop()

运行结果:

执行前 []
执行前 [<tkinter.Label object .!label>, <tkinter.Label object .!label2>, <tkinter.Label object .!label3>]

谢谢观看,笔者会持续更新,如有错误或者建议,请私信我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值