溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python Tkinter Pack布局管理器

發(fā)布時(shí)間:2020-09-24 10:04:10 來源:億速云 閱讀:193 作者:Leah 欄目:編程語言

Python Tkinter Pack布局管理器?很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

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

如果使用 Pack 布局,那么當(dāng)程序向容器中添加組件時(shí),這些組件會依次向后排列,排列方向既可是水平的,也可是垂直的。

下面程序簡單示范了 Pack 布局的用法,該程序向窗口中添加了三個(gè) 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個(gè)Label" % (i + 1), bg='#eeeeee')
    # 調(diào)用pack進(jìn)行布局
    lab.pack()
# 啟動主窗口的消息循環(huán)
root.mainloop()

上面程序創(chuàng)建了一個(gè)窗口,然后使用循環(huán)創(chuàng)建了三個(gè) Label,并對這三個(gè) Label 使用了 pack() 方法進(jìn)行默認(rèn)的 Pack 布局。運(yùn)行該程序看到如圖所示的界面:

Python Tkinter Pack布局管理器

上圖圖使用的是默認(rèn)的 Pack 布局,實(shí)際上程序在調(diào)用 pack() 方法時(shí)可傳入多個(gè)選項(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)可用空間大于組件所需求的大小時(shí),該選項(xiàng)決定組件被放置在容器的何處。該選項(xiàng)支持 N(北,代表上)、E(東,代表右)、S(南,代表下)、W(西,代表左)、NW(西北,代表左上)、NE(東北,代表右上)、SW(西南,代表左下)、SE(東南,代表右下)、CENTER(中,默認(rèn)值)這些值。

expand:該 bool 值指定當(dāng)父容器增大時(shí)才是否拉伸組件。

fill:設(shè)置組件是否沿水平或垂直方向填充。該選項(xiàng)支持 NONE、X、Y、BOTH 四個(gè)值,其中 NONE 表示不填充,BOTH 表示沿著兩個(gè)方向填充。

ipadx:指定組件在 x 方向(水平)上的內(nèi)部留白(padding)。

ipady:指定組件在 y 方向(水平)上的內(nèi)部留白(padding)。

padx:指定組件在 x 方向(水平)上與其他組件的間距。

pady:指定組件在 y 方向(水平)上與其他組件的間距。

side:設(shè)置組件的添加位置,可以設(shè)置為 TOP、BOTTOM、LEFT 或 RIGHT 這四個(gè)值的其中之一。

當(dāng)程序界面比較復(fù)雜時(shí),就需要使用多個(gè)容器(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)建第一個(gè)容器
        fm1 = Frame(self.master)
        # 該容器放在左邊排列
        fm1.pack(side=LEFT, fill=BOTH, expand=YES)
        # 向fm1中添加3個(gè)按鈕
        # 設(shè)置按鈕從頂部開始排列,且按鈕只能在垂直(X)方向填充
        Button(fm1, text='第一個(gè)').pack(side=TOP, fill=X, expand=YES)
        Button(fm1, text='第二個(gè)').pack(side=TOP, fill=X, expand=YES)
        Button(fm1, text='第三個(gè)').pack(side=TOP,  fill=X, expand=YES)
        # 創(chuàng)建第二個(gè)容器
        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個(gè)按鈕
        # 設(shè)置按鈕從右邊開始排列
        Button(fm2, text='第一個(gè)').pack(side=RIGHT, fill=Y, expand=YES)
        Button(fm2, text='第二個(gè)').pack(side=RIGHT, fill=Y, expand=YES)
        Button(fm2, text='第三個(gè)').pack(side=RIGHT, fill=Y, expand=YES)       
        # 創(chuàng)建第三個(gè)容器
        fm3 = Frame(self.master)
        # 該容器放在右邊排列,就會挨著fm1
        fm3.pack(side=RIGHT, padx=10, fill=BOTH, expand=YES)
        # 向fm3中添加3個(gè)按鈕
        # 設(shè)置按鈕從底部開始排列,且按鈕只能在垂直(Y)方向填充
        Button(fm3, text='第一個(gè)').pack(side=BOTTOM, fill=Y, expand=YES)
        Button(fm3, text='第二個(gè)').pack(side=BOTTOM, fill=Y, expand=YES)
        Button(fm3, text='第三個(gè)').pack(side=BOTTOM, fill=Y, expand=YES)
root = Tk()
root.title("Pack布局")
display = App(root)
root.mainloop()

上面程序創(chuàng)建了三個(gè) Frame 容器,其中第一個(gè) Frame 容器內(nèi)包含三個(gè)從頂部(TOP)開始排列的按鈕,這意味著這三個(gè)按鈕會從上到下依次排列,且這三個(gè)按鈕能在水平(X)方向上填充;第二個(gè) Frame 容器內(nèi)包含三個(gè)從右邊(RIGHT)開始排列的按鈕,這意味著這三個(gè)按鈕會從右向左依次排列;第三個(gè) Frame 容器內(nèi)包含三個(gè)從底部(BOTTOM)開始排列的按鈕,這意味著這三個(gè)按鈕會從下到上依次排列,且這三個(gè)按鈕能在垂直(Y)方向上填充。

運(yùn)行上面程序,將看到如下圖所示的界面。

Python Tkinter Pack布局管理器

從上圖中可以看到,為運(yùn)行效果添加了三個(gè)框,分別代表 fm1、fm2、fm3(實(shí)際上容器是看不到的),此時(shí)可以看到 fm1 內(nèi)的三個(gè)按鈕從上到下排列,并且可以在水平方向上填充;fm3 內(nèi)的三個(gè)按鈕從下到上排列,并且可以在垂直方向上填充。

可能有讀者會有疑問,fm2 內(nèi)的三個(gè)按鈕也都設(shè)置了 fill=Y,expand=YES,這說明它們也能在垂直方向上填充,為啥舍看不到呢?仔細(xì)看 fm2.pack(side=LEFT, padx=10, expand= YES)這行代碼,它說明 fm2 本身不在任何方向上填充,因此 fm2 內(nèi)的三個(gè)按鈕都不能填充。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI