簡介
在設計GUI程序時,可以使用三種方法包裝和定位各組件在容器
或窗口
內的位置
這三種方法又稱窗口控件配置管理員
(Widget Layout Manager)
pack 方法
grid 方法
place 方法
pack 方法
雖然我們稱pack
方法,其實是在tkinter內這是一個類別。這是最常使用的控件配置管理方法,它是使用相對位置的概念處理Widget控件配置,至於控件的正確位置,則是由pack 方法自動完成。
pack 方法的語法格式:
pack(options, ...)
它的參數有 side
、fill
、padx/pady
、ipadx/ipady
、anchor
side參數
side
參數可以垂直或水平配置控件
例子
:
import tkinter
# 創建主窗口
root = tkinter.Tk()
label1 = tkinter.Label(root, text="One",
bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
bg="lightblue")
label3 = tkinter.Label(root, text="Three",
bg="lightgreen")
label1.pack()
label2.pack()
label3.pack()
root.mainloop()
運行結果:
當窗口中有多個組件時,使用pack
可以讓組件由上往下排列顯示,這其實也是系統的默認設置。
使用pack
方法時,也可以增加side
參數設置組件的排列方式,參數如下:
- TOP:這是默認值,由上往下排列
- BOTTOM:由下往上排列
- LEFT:由左往右排列
- RIGHT:由右往左排列
例子
:使用從下往上排列
label1.pack(side=tkinter.BOTTOM)
label2.pack(side=tkinter.BOTTOM)
label3.pack(side=tkinter.BOTTOM)
運行結果:
例子
:從左往右排列
label1.pack(side=tkinter.LEFT)
label2.pack(side=tkinter.LEFT)
label3.pack(side=tkinter.LEFT)
運行結果:
例子
:從右往左排列
label1.pack(side=tkinter.RIGHT)
label2.pack(side=tkinter.RIGHT)
label3.pack(side=tkinter.RIGHT)
運行結果:
例子
:重新設計side
,使之成三角狀
import tkinter
# 創建主窗口
root = tkinter.Tk()
label1 = tkinter.Label(root, text="One",
bg="lightyellow",
width=10)
label2 = tkinter.Label(root, text="Two",
bg="lightblue",
width=10)
label3 = tkinter.Label(root, text="Three",
bg="lightgreen",
width=10)
label1.pack()
label2.pack(side=tkinter.LEFT)
label3.pack(side=tkinter.RIGHT)
root.mainloop()
運行結果:
例子
:列出relief
的全部屬性
import tkinter
Reliefs = ["flat", "groove", "raised", "ridge", "solid", "sunken"]
# 創建主窗口
root = tkinter.Tk()
for Relief in Reliefs:
tkinter.Label(root, text=Relief, relief=Relief,
fg="blue").pack(side=tkinter.LEFT, padx=5)
root.mainloop()
運行結果:
例子
:列出所有bitmaps
位圖
import tkinter
bitMaps = ["error", "hourglass", "info", "questhead", "question", "warning", "gray12", "gray25", "gray50", "gray75"]
# 創建主窗口
root = tkinter.Tk()
for bitmaps in bitMaps:
tkinter.Label(root, bitmap=bitmaps).pack(side=tkinter.LEFT, padx=5)
root.mainloop()
運行結果:
padx/pady參數
在使用pack
方法時,可以使用padx/pady
參數設定控件邊界與容器(可想成窗口邊界)的距離或是控件邊界間的距離。
在默認環境下,窗口控件間的距離是1像素。如果希望有適度間距,可以設置參數padx/pady
,代表水平間距/垂直間距
例子
:在Two
上下增加10像素間距
import tkinter
# 創建主窗口
root = tkinter.Tk()
label1 = tkinter.Label(root, text="One",
bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
bg="lightblue")
label3 = tkinter.Label(root, text="Three",
bg="lightgreen")
label1.pack(fill=tkinter.X)
label2.pack(pady=10)
label3.pack(fill=tkinter.X)
root.mainloop()
運行結果:
結果很明顯,就是Two
(label2)上下各有10像素
例子
:在One
上下增加10像素間距
label1.pack(fill=tkinter.X, pady=10)
label2.pack(pady=10)
label3.pack(fill=tkinter.X)
運行結果:
One
與 Two
中間是兩個10像素,所以是20像素
例子
:標籤寬度爲10像素,左右邊界與容器邊界是30像素
import tkinter
# 創建主窗口
root = tkinter.Tk()
label1 = tkinter.Label(root, text="One",
bg="lightyellow",
width=10)
label2 = tkinter.Label(root, text="Two",
bg="lightblue",
width=10)
label3 = tkinter.Label(root, text="Three",
bg="lightgreen",
width=10)
label1.pack(padx=30)
label2.pack(padx=30)
label3.pack(padx=30)
root.mainloop()
運行結果:
例子
:使三個標籤橫向排列,Two 的左右邊界爲10像素
import tkinter
# 創建主窗口
root = tkinter.Tk()
label1 = tkinter.Label(root, text="One",
bg="lightyellow",
width=10)
label2 = tkinter.Label(root, text="Two",
bg="lightblue",
width=10)
label3 = tkinter.Label(root, text="Three",
bg="lightgreen",
width=10)
label1.pack(side=tkinter.LEFT)
label2.pack(side=tkinter.LEFT, padx=10)
label3.pack(side=tkinter.LEFT)
root.mainloop()
運行結果:
ipadx/ipady參數
ipadx
參數可以控制標籤文字與標籤容器的X軸間距,ipady
參數可以控制標籤文字與標籤容器的Y軸間距
例子
:讓Two
標籤的X軸間距是20
import tkinter
# 創建主窗口
root = tkinter.Tk()
label1 = tkinter.Label(root, text="One",
bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
bg="lightblue")
label3 = tkinter.Label(root, text="Three",
bg="lightgreen")
label1.pack()
label2.pack(ipadx=10)
label3.pack()
root.mainloop()
運行結果:
例子
:讓Two
標籤的Y軸間距是20
import tkinter
# 創建主窗口
root = tkinter.Tk()
label1 = tkinter.Label(root, text="One",
bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
bg="lightblue")
label3 = tkinter.Label(root, text="Three",
bg="lightgreen")
label1.pack()
label2.pack(ipady=10)
label3.pack()
root.mainloop()
運行結果:
padx參數與ipadx參數的區別
- padx:是指標籤的
小框框
與窗口
的距離,或者是與其他小框框
的距離 - ipadx:是指標籤內部的
文字
與小框框
的距離
anchor參數
這個參數可以設定Widget
控件在窗口中的位置,但是在這裏是指控件內容在控件區域的位置設置
其實就是標籤文字在標籤區域的位置
例子
:在窗口右下方建立一個內容爲“One”的標籤,其中標籤與窗口右邊和下邊的間距爲10像素
import tkinter
# 創建主窗口
root = tkinter.Tk()
root.geometry("300x200")
label1 = tkinter.Label(root, text="One",
bg="lightgreen", width=8, height=2)
label1.pack(anchor=tkinter.S, side=tkinter.RIGHT, padx=10, pady=10)
root.mainloop()
運行結果:
例子
:在窗口正下方建立一個內容爲“One”的標籤,其中標籤與窗口右邊和下邊的間距爲10像素
import tkinter
# 創建主窗口
root = tkinter.Tk()
root.geometry("300x200")
label1 = tkinter.Label(root, text="One",
bg="lightgreen", width=8, height=2)
label1.pack(anchor=tkinter.S, side=tkinter.BOTTOM, padx=10, pady=10)
root.mainloop()
運行結果:
例子
:增加一個標籤,使兩個標籤在右下方一次排開
import tkinter
# 創建主窗口
root = tkinter.Tk()
root.geometry("300x200")
label1 = tkinter.Label(root, text="One",
bg="lightgreen", width=8, height=2)
label2 = tkinter.Label(root, text="Two",
bg="lightblue", width=8, height=2)
label1.pack(anchor=tkinter.S, side=tkinter.RIGHT, padx=10, pady=10)
label2.pack(anchor=tkinter.S, side=tkinter.RIGHT, pady=10)
root.mainloop()
運行結果:
fill參數
fill
參數的主要功能是告訴 pack
管理程序,設置控件填滿所分配容器區間
的方式
參數:
- fill = X:表示控件可以填滿所分配空間的
X軸
不留白 - fill = Y:表示控件可以填滿所分配空間的
Y軸
不留白 - fill = BOTH:表示控件可以填滿所分配空間的
X軸和Y軸
- fill默認值爲NONE,表示保持原大小
例子
:是第1個標籤和第3個標籤內增加fill = X 參數
import tkinter
# 創建主窗口
root = tkinter.Tk()
label1 = tkinter.Label(root, text="One",
bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
bg="lightblue")
label3 = tkinter.Label(root, text="Three",
bg="lightgreen")
label1.pack(fill=tkinter.X)
label2.pack()
label3.pack(fill=tkinter.X)
root.mainloop()
運行結果:
由此可見,第一欄和第三欄已被填充滿
如果所分配容器區間已經滿了,則使用此fill
參數將不會有任何作用。
fill
參數在使用上能有些複雜,建議使用後續的grid
方法
例子
:驗證如果所分配的容器區間已經滿了,則使用此fill
參數將不會有任何作用
label1.pack(fill=tkinter.X)
label2.pack(fill=tkinter.Y)
label3.pack(fill=tkinter.X)
運行結果:
一模一樣
下面我們來使用fill = BOTH使它全部填充
import tkinter
# 創建主窗口
root = tkinter.Tk()
label1 = tkinter.Label(root, text="One",
bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
bg="lightblue")
label3 = tkinter.Label(root, text="Three",
bg="lightgreen")
label1.pack(fill=tkinter.BOTH, side=tkinter.LEFT)
label2.pack(fill=tkinter.Y)
label3.pack(fill=tkinter.BOTH)
root.mainloop()
運行結果:
我們發現,本來BOTH
是填充X軸
和Y軸
的,但是Three
的Y軸並沒有被填充
這是爲什麼呢?當擴充窗口大小時,Three
在Y軸的空間稱爲額外空間,這時需要藉助一個叫expand
的參數
expand參數
expand 參數可設定Widget控件是否填額外
的父容器空間
- 默認是
False
(或是0),表示不填滿 - 如果是True(或是1),表示填滿
例子
:
import tkinter
# 創建主窗口
root = tkinter.Tk()
label1 = tkinter.Label(root, text="One",
bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
bg="lightblue")
label3 = tkinter.Label(root, text="Three",
bg="lightgreen")
label1.pack(fill=tkinter.BOTH, side=tkinter.LEFT)
label2.pack(fill=tkinter.X)
label3.pack(fill=tkinter.BOTH, expand=1)
root.mainloop()
運行結果:
pack 的方法
pack
其實在Python tkinter中是一個類別,他提供下列方法供我們使用
方法名稱 | 說明 |
---|---|
slaves() | 傳回所有Widget控件對象 |
info() | 傳回pack選項的對應值 |
forget() | 隱藏Widget控件,可以用pack(option,…)復原實現 |
location(x,y) | 傳回此點是否在單元格,如果是傳回座標,如果不是傳回(-1,-1) |
size() | 傳回Widget控件大小。 |
propagate() | 參數是True表示副父口大小由子控件決定,默認爲True |
例子
:列出執行前後Widget控件中的內容
import tkinter
# 創建主窗口
root = tkinter.Tk()
print("執行前", root.pack_slaves())
label1 = tkinter.Label(root, text="One",
bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
bg="lightblue")
label3 = tkinter.Label(root, text="Three",
bg="lightgreen")
label1.pack(fill=tkinter.BOTH, side=tkinter.LEFT)
label2.pack(fill=tkinter.X)
label3.pack(fill=tkinter.BOTH, expand=1)
print("執行前", root.pack_slaves())
root.mainloop()
運行結果:
執行前 []
執行前 [<tkinter.Label object .!label>, <tkinter.Label object .!label2>, <tkinter.Label object .!label3>]
謝謝觀看,筆者會持續更新,如有錯誤或者建議,請私信我