嘿,大家好!上次我們往視窗裡丟了標籤、按鈕、輸入框這些小東西,感覺有點熱鬧了吧?不過你有沒有發現,用 pack() 丟進去後,它們就自己排成一列,亂亂的,想調整位置有點麻煩。這次我們要來聊「佈局管理」,教你怎麼把這些元件擺得整整齊齊,像個有條理的大人,而不是隨便亂塞的小孩。準備好啦?來囉!
什麼是佈局管理?
簡單說,佈局管理就是決定視窗裡的東西要擺哪、怎麼排。Tkinter 有三招幫你搞定這件事:pack()
、grid()
和 place()
。上次我們用過 pack()
,這次我們要把三招都玩一遍,告訴你什麼時候用哪招最順手。第一招:pack() - 簡單堆疊
pack() 是最懶人的一招,適合不想動太多腦的時候。它會自動把元件堆起來,像疊積木一樣,預設是從上往下排。
來試試:
import tkinter as tk
window = tk.Tk()
window.title("Pack 測試")
window.geometry("300x200")
label = tk.Label(window, text="我是標籤", bg="lightblue")
label.pack()
button = tk.Button(window, text="點我")
button.pack()
entry = tk.Entry(window)
entry.pack()
window.mainloop()

跑一下,東西就一條直線往下排,乾淨但有點單調。如果想橫著排,可以加個 side:
label.pack(side="left") # 靠左
button.pack(side="left") # 繼續往左邊擠
entry.pack(side="left")

這下它們會從左往右排,像排隊買便當一樣。但問題是,pack() 不太靈活,位置不好微調,適合簡單的東西。
第二招:grid() - 像表格一樣整齊
如果 pack() 是懶人招,那 grid() 就是有條理控的最愛!它把視窗當成一個表格,你可以指定每個元件在第幾行、第幾列,超好用。
來做個簡單的登入介面:
import tkinter as tk
window = tk.Tk()
window.title("登入視窗")
window.geometry("300x200")
# 第一行:帳號標籤和輸入框
tk.Label(window, text="帳號:").grid(row=0, column=0)
tk.Entry(window).grid(row=0, column=1)
# 第二行:密碼標籤和輸入框
tk.Label(window, text="密碼:").grid(row=1, column=0)
tk.Entry(window, show="*").grid(row=1, column=1) # show="*" 把密碼變星星
# 第三行:登入按鈕
tk.Button(window, text="登入").grid(row=2, column=1)
window.mainloop()

跑跑看!是不是像個小表格?
- row 和 column:指定行和列,從 0 開始數。
- show="*":輸入框裡的字會變成星星,很適合密碼欄。
想讓它更好看點,可以加點間距:
tk.Label(window, text="帳號:").grid(row=0, column=0, padx=5, pady=5)
tk.Entry(window).grid(row=0, column=1, padx=5, pady=5)

padx 和 pady 是水平和垂直的間距,單位是像素,這樣就不會擠在一起啦。
第三招:place() - 精準定位
如果你是完美主義者,喜歡把東西擺得一絲不苟,那 place() 就是你的菜。它讓你用坐標(x, y)直接指定位置,像在畫布上畫畫一樣。
試試這個:
import tkinter as tk
window = tk.Tk()
window.title("Place 測試")
window.geometry("300x200")
label = tk.Label(window, text="我在正中間!")
label.place(x=100, y=80)
button = tk.Button(window, text="我在角落")
button.place(x=200, y=150)
window.mainloop()

跑起來,標籤和按鈕會乖乖待在你指定的位置。
- x 和 y:從視窗左上角(0, 0)開始算的坐標。
- 優點:超精準,想放哪就放哪。
- 缺點:視窗大小變了,位置不會自動調整,有點麻煩。
三招怎麼選?
- pack():簡單快速,適合單排的東西,像導覽列或一堆按鈕。
- grid():表格型佈局,適合表單、計算器這種有規律的設計。
- place():需要像素級控制時用,比如自訂遊戲介面。
通常我會建議先學好 grid(),因為它靈活又直觀,用的機會最多。
小挑戰:動手排排看
好了,輪到你啦!試著用 grid() 做一個簡單的聯絡人表單,包含:
- 三行標籤和輸入框:姓名、電話、信箱。
- 第四行放個「送出」按鈕,擺在右邊。
- 加點 padx 和 pady,讓它看起來舒服點。
做完跑跑看,輸入點假資料試試,感覺自己是不是越來越厲害了?

結語
今天我們把視窗從亂七八糟變得整整齊齊,學會了 pack()、grid() 和 place() 三招。怎麼樣,現在是不是覺得元件聽話多了?下次我們要讓這些東西動起來,聊聊「事件處理」,讓按鈕不只是裝飾品。有啥問題隨時問我,我們下篇見啦!