1. 程式人生 > >Tkinter 佈局管理器(一):pack

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()
-- 以列表的形式返回該元件的所有子元件
-- 該方法僅適用於父元件