新聞中心
GUI 編程就相當(dāng)于小孩子搭積木,每個積木塊應(yīng)該放在哪里,每個積木塊顯示為多大,也就是對大小和位置都需要進(jìn)行管理,而布局管理器正是負(fù)責(zé)管理各組件的大小和位置的。此外,當(dāng)用戶調(diào)整了窗口的大小之后,布局管理器還會自動調(diào)整窗口中各組件的大小和位置。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、成都微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了儀征免費(fèi)建站歡迎大家使用!
python學(xué)習(xí)網(wǎng),大量的免費(fèi)python視頻教程,歡迎在線學(xué)習(xí)!
如果使用 Pack 布局,那么當(dāng)程序向容器中添加組件時,這些組件會依次向后排列,排列方向既可是水平的,也可是垂直的。
下面程序簡單示范了 Pack 布局的用法,該程序向窗口中添加了三個 Label 組件:
# Python 2.x使用這行
#from Tkinter import *
# Python 3.x使用這行
from tkinter import *
# 創(chuàng)建窗口并設(shè)置窗口標(biāo)題
root = Tk()
# 設(shè)置窗口標(biāo)題
root.title('Pack布局')
for i in range(3):
lab = Label(root, text="第%d個Label" % (i + 1), bg='#eeeeee')
# 調(diào)用pack進(jìn)行布局
lab.pack()
# 啟動主窗口的消息循環(huán)
root.mainloop()上面程序創(chuàng)建了一個窗口,然后使用循環(huán)創(chuàng)建了三個 Label,并對這三個 Label 使用了 pack() 方法進(jìn)行默認(rèn)的 Pack 布局。運(yùn)行該程序看到如圖所示的界面:
上圖圖使用的是默認(rèn)的 Pack 布局,實(shí)際上程序在調(diào)用 pack() 方法時可傳入多個選項(xiàng)。例如,通過 help(tkinter.Label.pack) 命令來查看 pack() 方法支持的選項(xiàng),可以看到如下輸出結(jié)果:
>>> help(tkinter.Label.pack)
Help on function pack_configure in module tkinter:
pack_configure(self, cnf={}, **kw)
Pack a widget in the parent widget. Use as options:
after=widget - pack it after you have packed widget
anchor=NSEW (or subset) - position widget according to
given direction
before=widget - pack it before you will pack widget
expand=bool - expand widget if parent size grows
fill=NONE or X or Y or BOTH - fill widget if widget grows
in=master - use master to contain this widget
in_=master - see 'in' option description
ipadx=amount - add internal padding in x direction
ipady=amount - add internal padding in y direction
padx=amount - add padding in x direction
pady=amount - add padding in y direction
side=TOP or BOTTOM or LEFT or RIGHT - where to add this widget.從上面的顯示信息可以看出,pack() 方法通??芍С秩缦逻x項(xiàng):
anchor:當(dāng)可用空間大于組件所需求的大小時,該選項(xiàng)決定組件被放置在容器的何處。該選項(xiàng)支持 N(北,代表上)、E(東,代表右)、S(南,代表下)、W(西,代表左)、NW(西北,代表左上)、NE(東北,代表右上)、SW(西南,代表左下)、SE(東南,代表右下)、CENTER(中,默認(rèn)值)這些值。
expand:該 bool 值指定當(dāng)父容器增大時才是否拉伸組件。
fill:設(shè)置組件是否沿水平或垂直方向填充。該選項(xiàng)支持 NONE、X、Y、BOTH 四個值,其中 NONE 表示不填充,BOTH 表示沿著兩個方向填充。
ipadx:指定組件在 x 方向(水平)上的內(nèi)部留白(padding)。
ipady:指定組件在 y 方向(水平)上的內(nèi)部留白(padding)。
padx:指定組件在 x 方向(水平)上與其他組件的間距。
pady:指定組件在 y 方向(水平)上與其他組件的間距。
side:設(shè)置組件的添加位置,可以設(shè)置為 TOP、BOTTOM、LEFT 或 RIGHT 這四個值的其中之一。
當(dāng)程序界面比較復(fù)雜時,就需要使用多個容器(Frame)分開布局,然后再將 Frame 添加到窗口中。例如如下程序:
# Python 2.x使用這行
#from Tkinter import *
# Python 3.x使用這行
from tkinter import *
class App:
def __init__(self, master):
self.master = master
self.initWidgets()
def initWidgets(self):
# 創(chuàng)建第一個容器
fm1 = Frame(self.master)
# 該容器放在左邊排列
fm1.pack(side=LEFT, fill=BOTH, expand=YES)
# 向fm1中添加3個按鈕
# 設(shè)置按鈕從頂部開始排列,且按鈕只能在垂直(X)方向填充
Button(fm1, text='第一個').pack(side=TOP, fill=X, expand=YES)
Button(fm1, text='第二個').pack(side=TOP, fill=X, expand=YES)
Button(fm1, text='第三個').pack(side=TOP, fill=X, expand=YES)
# 創(chuàng)建第二個容器
fm2 = Frame(self.master)
# 該容器放在左邊排列,就會挨著fm1
fm2.pack(side=LEFT, padx=10, expand=YES)
fm2.pack(side=LEFT, padx=10, fill=BOTH, expand=YES)
# 向fm2中添加3個按鈕
# 設(shè)置按鈕從右邊開始排列
Button(fm2, text='第一個').pack(side=RIGHT, fill=Y, expand=YES)
Button(fm2, text='第二個').pack(side=RIGHT, fill=Y, expand=YES)
Button(fm2, text='第三個').pack(side=RIGHT, fill=Y, expand=YES)
# 創(chuàng)建第三個容器
fm3 = Frame(self.master)
# 該容器放在右邊排列,就會挨著fm1
fm3.pack(side=RIGHT, padx=10, fill=BOTH, expand=YES)
# 向fm3中添加3個按鈕
# 設(shè)置按鈕從底部開始排列,且按鈕只能在垂直(Y)方向填充
Button(fm3, text='第一個').pack(side=BOTTOM, fill=Y, expand=YES)
Button(fm3, text='第二個').pack(side=BOTTOM, fill=Y, expand=YES)
Button(fm3, text='第三個').pack(side=BOTTOM, fill=Y, expand=YES)
root = Tk()
root.title("Pack布局")
display = App(root)
root.mainloop()上面程序創(chuàng)建了三個 Frame 容器,其中第一個 Frame 容器內(nèi)包含三個從頂部(TOP)開始排列的按鈕,這意味著這三個按鈕會從上到下依次排列,且這三個按鈕能在水平(X)方向上填充;第二個 Frame 容器內(nèi)包含三個從右邊(RIGHT)開始排列的按鈕,這意味著這三個按鈕會從右向左依次排列;第三個 Frame 容器內(nèi)包含三個從底部(BOTTOM)開始排列的按鈕,這意味著這三個按鈕會從下到上依次排列,且這三個按鈕能在垂直(Y)方向上填充。
運(yùn)行上面程序,將看到如下圖所示的界面。
從上圖中可以看到,為運(yùn)行效果添加了三個框,分別代表 fm1、fm2、fm3(實(shí)際上容器是看不到的),此時可以看到 fm1 內(nèi)的三個按鈕從上到下排列,并且可以在水平方向上填充;fm3 內(nèi)的三個按鈕從下到上排列,并且可以在垂直方向上填充。
可能有讀者會有疑問,fm2 內(nèi)的三個按鈕也都設(shè)置了 fill=Y,expand=YES,這說明它們也能在垂直方向上填充,為啥舍看不到呢?仔細(xì)看 fm2.pack(side=LEFT, padx=10, expand= YES)這行代碼,它說明 fm2 本身不在任何方向上填充,因此 fm2 內(nèi)的三個按鈕都不能填充。
當(dāng)前題目:創(chuàng)新互聯(lián)Python教程:Python Tkinter Pack布局管理器
文章地址:http://fisionsoft.com.cn/article/cocesoh.html


咨詢
建站咨詢
