Tkinter 佈局管理器(一):pack
Tkinter 佈局管理器之pack
pack、grid 和 place 均用於管理同在一個父元件下的所有元件的佈局,其中:
- pack 是按新增順序排列元件
- grid 是按行/列形式排列元件
- place 則允許程式設計師指定元件的大小和位置
何時使用 pack 管理器?
對比 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()
-- 以列表的形式返回該元件的所有子元件
-- 該方法僅適用於父元件