py 第三十四天 Tkinter22:布局管理器 pack

一、介绍

packgridplace 均用于管理同在一个父组件下的所有组件的布局,其中:
pack是按添加顺序排列组件
grid 是按行/列形式排列组件
place则允许程序员指定组件的大小和位置

二、使用

对比grid管理器,pack更适用于少量组件的排列,但它在使用上更加简单(就像我们前边所有的例子中,展示一个组件我们一般都直接使用 .pack(),多简单~)。如果你需要创建相对复杂的布局结构,那么建议是使用多个框架Frame结构构成,或者使用grid 管理器实现。

注意:不要在同一个父组件中混合使用 pack 和 grid,因为 Tkinter 会很认真地在那儿计算到底先使用那个布局管理器......以至于你等了半个小时,Tkinter 还在那儿纠结不出结果!

我们常常会遇到的一个情况是将一个组件放到一个容器组件中,并填充整个父组件。这儿给大家举个例子,我们生成一个Listbox组件并将它填充到root窗口中:

from tkinter import *

root = Tk()

listbox = Listbox(root)
listbox.pack(fill=BOTH, expand=True) 

for i in range(10):
    listbox.insert(END, str(i))

mainloop()

其中,fill选项是告诉窗口管理器该组件将填充整个分配给它的空间,BOTH 表示同时横向和纵向扩展,X 表示横向,Y表示纵向;expand选项是告诉窗口管理器拉伸的时候将父组件的额外空间也填满,

默认下,pack 是将添加的组件依次纵向排列:

from tkinter import *

root = Tk()

Label(root, text="Red", bg="red", fg="white").pack(fill=X)  #fill = X表示纵向填充 Y是横向
Label(root, text="Green", bg="green", fg="black").pack(fill=X)
Label(root, text="Blue", bg="blue", fg="white").pack(fill=X)

mainloop()

如果想要组件横向挨个儿排放,你可以使用side 选项:

from tkinter import *

root = Tk()

Label(root, text="Red", bg="red", fg="white").pack(side=LEFT)
Label(root, text="Green", bg="green", fg="black").pack(side=LEFT)
Label(root, text="Blue", bg="blue", fg="white").pack(side=LEFT)

mainloop()

三、方法

pack(**options)
-- 下方表格详细列举了各个选项的具体含义和用法:

选项 含义
anchor 1. 控制组件在 pack 分配的空间中的位置
2. N, NE, E, SE, S, SW, W, NW, 或 CENTER 来定位(EWSN代表东西南北,上北下南左西右东)
3. 默认值是 CENTER
expand 1. 指定是否填充父组件的额外空间
2. 默认值是 False
fill 1. 指定填充 pack 分配的空间
2. 默认值是 NONE,表示保持子组件的原始尺寸
3. 还可以使用的值有:X(水平填充),Y(垂直填充)和 BOTH(水平和垂直填充)
in_ 1. 将该组件放到该选项指定的组件中
2. 指定的组件必须是该组件的父组件
ipadx 指定水平方向上的内边距
ipady 指定垂直方向上的内边距
padx 指定水平方向上的外边距
pady 指定垂直方向上的外边距
side 1. 指定组件的放置位置
2. 默认值是 TOP
3. 还可以设置的值有:LEFT,BOTTOM,RIGHT

pack_configure(**options)
-- 跟 pack() 一样

pack_forget()
-- 将组件从屏幕中“删除”
-- 并没有销毁该组件,只是看不到了
-- 可以通过 pack或其他布局管理器显示已“删除”的组件

pack_info()
-- 以字典的形式返回当前 pack 的选项

pack_propagate(flag)
-- 如果开启,父组件会自动调节尺寸以容纳所有子组件
-- 默认值是开启(flag = True)
-- 该方法仅适用于父组件

pack_slaves()
-- 以列表的形式返回该组件的所有子组件
-- 该方法仅适用于父组件

https://fishc.com.cn/forum.php?mod=viewthread&tid=61464&extra=page%3D1%26filter%3Dtypeid%26typeid%3D604