一、介绍
pack
、grid
和 place
均用于管理同在一个父组件下的所有组件的布局,其中:
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()
-- 以列表的形式返回该组件的所有子组件
-- 该方法仅适用于父组件