pack、grid 和 place 均用于管理同在一个父组件下的所有组件的布局,其中:
对比 grid 管理器,pack 更适用于少量组件的排列,但它在使用上更加简单(就像我们前边所有的例子中,展示一个组件我们一般都直接使用 .pack(),多简单~)。如果你需要创建相对复杂的布局结构,那么建议是使用多个框架(Frame)结构构成,或者使用 grid 管理器实现。
注意:不要在同一个父组件中混合使用 pack 和 grid,因为 Tkinter 会很认真地在那儿计算到底先使用那个布局管理器......以至于你等了半个小时,Tkinter 还在那儿纠结不出结果!
我们常常会遇到的一个情况是将一个组件放到一个容器组件中,并填充整个父组件。这儿给大家举个例子,我们生成一个 Listbox 组件并将它填充到 root 窗口中:
import tkinter as tk
root = tk.Tk()
listbox = tk.Listbox(root)
listbox.pack(fill="both", expand=True)
for i in range(10):
listbox.insert("end", str(i))
root.mainloop()
其中,fill 选项是告诉窗口管理器该组件将填充整个分配给它的空间,"both" 表示同时横向和纵向扩展,"x" 表示横向,"y" 表示纵向;expand 选项是告诉窗口管理器将父组件的额外空间也填满。
默认下,pack 是将添加的组件依次纵向排列:
import tkinter as tk
root = tk.Tk()
tk.Label(root, text="Red", bg="red", fg="white").pack(fill="x")
tk.Label(root, text="Green", bg="green", fg="black").pack(fill="x")
tk.Label(root, text="Blue", bg="blue", fg="white").pack(fill="x")
root.mainloop()
如果想要组件横向挨个儿排放,你可以使用 side 选项:
import tkinter as tk
root = tk.Tk()
tk.Label(root, text="Red", bg="red", fg="white").pack(side="left")
tk.Label(root, text="Green", bg="green", fg="black").pack(side="left")
tk.Label(root, text="Blue", bg="blue", fg="white").pack(side="left")
root.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()
-- 以列表的形式返回该组件的所有子组件
-- 该方法仅适用于父组件