元件排列

元件排列方式常用的有pack()grid()兩種通用方法,說明如下表:

方法說明
pack()此方法使用 side 參數指定元件在容器物件上的放置位置。預設由上往下放置。side 可指定的參數有 top、left、right、bottom,依序代表的放置位置為上、左、右、下。
grid()以表格的方式進行排列。語法如下:
grid(row=列, column=行)

如下表格可以模擬為視窗。若寫法為
lbl.grid(row=1, column=2)

表示 lbl 會放在灰底的位置,即第 2 列第 3 行的位置。

| [0,0] | [0,1] | [0,2] |
| [1,0] | [1,1] | [1,2] |

pack()

[簡例] 依序將四個熱門動漫人物標籤放置在視窗的上左右下四個位置。 (檔名:pack01.py)

[結果]

說明

  1. 5-8行: 建立四個標籤。
  2. 9~12行: 將四個標籤放在視窗的上左右下的位置中。

pack() 進階參數:fill、expand、padx、pady

除了side參數,pack()還有幾個常用參數,用來控制元件是否隨視窗縮放、以及元件與周圍的間距,尤其在畫面有多個容器(Frame)互相堆疊時特別常用:

參數說明
fill設定元件是否隨容器縮放方向延展佔滿空間,可指定'x'(水平方向延展)、'y'(垂直方向延展)、'both'(水平垂直都延展)、'none'(預設值,不延展)。
expand設定為True時,元件會分配到父容器所有剩餘的多餘空間;預設值為False,元件只佔用剛好容納自己內容的空間。
padx設定元件與其他元件(或容器邊緣)之間的水平外部間距。
pady設定元件與其他元件(或容器邊緣)之間的垂直外部間距。

如下寫法建立一個LabelFrame容器,並用fill='x'讓它隨視窗寬度延展、padx/pady留出與視窗邊緣的間距;底下的Treeview清單則用fill='both', expand=True,讓它同時隨視窗寬度與高度延展,並在視窗縮放時分配到多餘空間:

fillexpand兩者搭配使用效果不同:只設定fill='x',元件寬度會撐滿容器,但視窗變高時元件不會跟著變高;若再加上expand=True,元件才會連同高度一起分配到父容器多出來的空間。

grid

網格佈局結果示意圖

這段程式碼建立了一個 (3 列橫列、4 欄直欄)的棋盤式空間。當所有元件定位完成後,視覺上的分佈如下表:

Column 0 (第 0 欄)Column 1 (第 1 欄)Column 2 (第 2 欄)Column 3 (第 3 欄)
Row 0 (第 0 列)火影忍者-鳴人(自動壓縮)(自動壓縮)航海王-魯夫
Row 1 (第 1 列)(空白)(自動壓縮)天兵公園-鳥哥(空白)
Row 2 (第 2 列)(空白)櫻桃小丸子-小丸子(空白)

擺放步驟拆解說明

  1. lbl00.grid(row=0, column=0)
    • 定位在最左上角的原點位置 ,顯示 「火影忍者-鳴人」
  2. lbl03.grid(row=0, column=3)
    • 與鳴人同在最上方(row=0),但放置於第 3 欄(column=3),顯示 「航海王-魯夫」
  3. lbl12.grid(row=1, column=2)
    • 移動到第二列(row=1),放在第 2 欄(column=2),顯示 「天兵公園-鳥哥」
  4. lbl21.grid(row=2, column=1)
    • 移動到第三列(row=2),放在第 1 欄(column=1),顯示 「櫻桃小丸子-小丸子」

[簡例] 將表格中的動漫人物依表格排列方式放置於視窗中。 (檔名:grid01.py)

[結果]


相關主題與延伸閱讀