2. 打包布局

什么是打包布局?

打包布局类似向行李箱里摆放积木块,有空间就放进去。默认上而下依次摆放。当然也可以设置参数来自下向上或自左向右摆放。

打包布局的方式比较简单。适合简单的布局场景。

布局方法

布局方法
说明
widget.pack()
按顺序自动排列控件(垂直或水平)

pack 常用属性:

属性
说明
类型
side
停靠窗口位置
str=tkinter.TOP、tkinter.BOTTOM、tkinter.LEFT、tkinter.RIGHT
padx
横向外边距离
int
pady
纵向外边距离
int
ipadx
横向内边距离
int
ipady
纵向内边距离
int
fill
填充方向
tkinter.NONE, tkinter.X, tkinter.Y, tkinter.BOTH
expand
是否扩展
int = 1或0(默认值)

side 属性:

用来设置打包放置边

值:

fill属性:

用于在某个方向上填充空白区域

值:

expand 属性

填充整个空白区域

值:

说明:

当expand值为1时,side 属性设置无效

ipadx/ipady 属性

设置内边距的值,默认单位为像素

值:

padx/pady 属性

设置外边距的值,默认单位为像素

值:

pack() 参数详解

以下用含有两个控件的窗口的布局来说明上述参数的含义,请注意观察 widget.pack() 内部参数的变化!

  1. 上下两个控件,控件占用的空间就是内部文字占用的空间。默认自上而下排列,依次挨着。主窗口下方空余,两个控件都不会占用。
# 上下两个控件,widget.pack 无参数,都使用默认值!
import tkinter
root = tkinter.Tk(className="pack布局示例")

# 设置 label 的背景色为灰色,好区分边界。
label = tkinter.Label(root, text="欢迎来到weimingze.com!", bg="grey")
label.pack()
btn = tkinter.Button(root, text="点我退出!", command=root.destroy)
btn.pack()
root.mainloop()

效果如图

tkinter的pack布局效果图

  1. 上下两个控件,让Label控件的文字左右两侧内边距空余 20 个像素,内侧上下空余10个像素。使用ipadx和ipady来设置预留widget占用的空间。
import tkinter
root = tkinter.Tk(className="pack布局示例")

# 设置 label 的背景色为灰色,好区分边界。
label = tkinter.Label(root, text="欢迎来到weimingze.com!", bg="grey")
label.pack(ipadx=20, ipady=10)
btn = tkinter.Button(root, text="点我退出!", command=root.destroy, bg='red')
btn.pack()
root.mainloop()

效果如图

tkinter的ipad效果图

  1. 上下两个控件,让Label控件的文字左右两侧外边距空余 50 个像素。上下预留 20个像素的空间。使用padx和pady来设置。
import tkinter
root = tkinter.Tk(className="pack布局示例")

# 设置 label 的背景色为灰色,好区分边界。
label = tkinter.Label(root, text="欢迎来到weimingze.com!", bg="grey")
label.pack(padx=50, pady=20)
btn = tkinter.Button(root, text="点我退出!", command=root.destroy, bg='red')
btn.pack()
root.mainloop()

效果如图

tkinter的pad效果图

  1. 上下两个控件,让Label控件填充主窗口x轴方向所有的空间。使用fill来设置。
import tkinter
root = tkinter.Tk(className="pack布局示例")

# 设置 label 的背景色为灰色,好区分边界。
label = tkinter.Label(root, text="欢迎来到weimingze.com!", bg="grey")
label.pack(fill=tkinter.X)
btn = tkinter.Button(root, text="点我退出!", command=root.destroy, bg='red')
btn.pack()
root.mainloop()

效果如图

tkinter的 fill 效果图

  1. 上下两个控件,让Label控件扩展到主窗口所有的剩余空间。将Button控件挤到下面,使用expand=1来设置。
import tkinter
root = tkinter.Tk(className="pack布局示例")

# 设置 label 的背景色为灰色,好区分边界。
label = tkinter.Label(root, text="欢迎来到weimingze.com!", bg="grey")
label.pack(expand=1)
btn = tkinter.Button(root, text="点我退出!", command=root.destroy, bg='red')
btn.pack()
root.mainloop()

Label控件占据红框区域。 效果如图

tkinter的expand=1效果图

  1. 上下两个控件,让Label和Button控件同时扩展到主窗口所有的剩余空间。使用expand=1来设置。
import tkinter
root = tkinter.Tk(className="pack布局示例")

# 设置 label 的背景色为灰色,好区分边界。
label = tkinter.Label(root, text="欢迎来到weimingze.com!", bg="grey")
label.pack(expand=1)
btn = tkinter.Button(root, text="点我退出!", command=root.destroy, bg='red')
btn.pack(expand=1)
root.mainloop()

两个控件平分主窗口空间。

效果如图

tkinter的expand效果图

  1. 让Label和Button两个控件左右排布。使用side属性来设置。
import tkinter
root = tkinter.Tk(className="pack布局示例")

# 设置 label 的背景色为灰色,好区分边界。
label = tkinter.Label(root, text="欢迎来到weimingze.com!", bg="grey")
label.pack(side=tkinter.LEFT)
btn = tkinter.Button(root, text="点我退出!", command=root.destroy, bg='red')
btn.pack(side=tkinter.LEFT)
root.mainloop()

两个控件都向左依次排列。

tkinter的side为left的效果图

  1. 让Label和Button两个控件左右排布。使用side属性来设置。
import tkinter
root = tkinter.Tk(className="pack布局示例")

# 设置 label 的背景色为灰色,好区分边界。
label = tkinter.Label(root, text="欢迎来到weimingze.com!", bg="grey")
label.pack(side=tkinter.LEFT)
btn = tkinter.Button(root, text="点我退出!", command=root.destroy, bg='red')
btn.pack(side=tkinter.RIGHT)
root.mainloop()

两个控件Label 靠左,Button靠右 排列。

效果如图

tkinter的side为both的效果图

动手来试试吧!