简介
在设计GUI程序时,可以使用三种方法包装和定位各组件在容器
或窗口
内的位置
这三种方法又称窗口控件配置管理员
(Widget Layout Manager)
pack 方法
grid 方法
place 方法
pack 方法
虽然我们称pack
方法,其实是在tkinter内这是一个类别。这是最常使用的控件配置管理方法,它是使用相对位置的概念处理Widget控件配置,至于控件的正确位置,则是由pack 方法自动完成。
pack 方法的语法格式:
pack(options, ...)
它的参数有 side
、fill
、padx/pady
、ipadx/ipady
、anchor
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)
运行结果:
One
与 Two
中间是两个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>]
谢谢观看,笔者会持续更新,如有错误或者建议,请私信我