您好,登錄后才能下訂單哦!
Python Tkinter Pack布局管理器?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
GUI 編程就相當于小孩子搭積木,每個積木塊應該放在哪里,每個積木塊顯示為多大,也就是對大小和位置都需要進行管理,而布局管理器正是負責管理各組件的大小和位置的。此外,當用戶調整了窗口的大小之后,布局管理器還會自動調整窗口中各組件的大小和位置。
如果使用 Pack 布局,那么當程序向容器中添加組件時,這些組件會依次向后排列,排列方向既可是水平的,也可是垂直的。
下面程序簡單示范了 Pack 布局的用法,該程序向窗口中添加了三個 Label 組件:
# Python 2.x使用這行 #from Tkinter import * # Python 3.x使用這行 from tkinter import * # 創建窗口并設置窗口標題 root = Tk() # 設置窗口標題 root.title('Pack布局') for i in range(3): lab = Label(root, text="第%d個Label" % (i + 1), bg='#eeeeee') # 調用pack進行布局 lab.pack() # 啟動主窗口的消息循環 root.mainloop()
上面程序創建了一個窗口,然后使用循環創建了三個 Label,并對這三個 Label 使用了 pack() 方法進行默認的 Pack 布局。運行該程序看到如圖所示的界面:
上圖圖使用的是默認的 Pack 布局,實際上程序在調用 pack() 方法時可傳入多個選項。例如,通過 help(tkinter.Label.pack) 命令來查看 pack() 方法支持的選項,可以看到如下輸出結果:
>>> 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() 方法通常可支持如下選項:
anchor:當可用空間大于組件所需求的大小時,該選項決定組件被放置在容器的何處。該選項支持 N(北,代表上)、E(東,代表右)、S(南,代表下)、W(西,代表左)、NW(西北,代表左上)、NE(東北,代表右上)、SW(西南,代表左下)、SE(東南,代表右下)、CENTER(中,默認值)這些值。
expand:該 bool 值指定當父容器增大時才是否拉伸組件。
fill:設置組件是否沿水平或垂直方向填充。該選項支持 NONE、X、Y、BOTH 四個值,其中 NONE 表示不填充,BOTH 表示沿著兩個方向填充。
ipadx:指定組件在 x 方向(水平)上的內部留白(padding)。
ipady:指定組件在 y 方向(水平)上的內部留白(padding)。
padx:指定組件在 x 方向(水平)上與其他組件的間距。
pady:指定組件在 y 方向(水平)上與其他組件的間距。
side:設置組件的添加位置,可以設置為 TOP、BOTTOM、LEFT 或 RIGHT 這四個值的其中之一。
當程序界面比較復雜時,就需要使用多個容器(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): # 創建第一個容器 fm1 = Frame(self.master) # 該容器放在左邊排列 fm1.pack(side=LEFT, fill=BOTH, expand=YES) # 向fm1中添加3個按鈕 # 設置按鈕從頂部開始排列,且按鈕只能在垂直(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) # 創建第二個容器 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個按鈕 # 設置按鈕從右邊開始排列 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) # 創建第三個容器 fm3 = Frame(self.master) # 該容器放在右邊排列,就會挨著fm1 fm3.pack(side=RIGHT, padx=10, fill=BOTH, expand=YES) # 向fm3中添加3個按鈕 # 設置按鈕從底部開始排列,且按鈕只能在垂直(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()
上面程序創建了三個 Frame 容器,其中第一個 Frame 容器內包含三個從頂部(TOP)開始排列的按鈕,這意味著這三個按鈕會從上到下依次排列,且這三個按鈕能在水平(X)方向上填充;第二個 Frame 容器內包含三個從右邊(RIGHT)開始排列的按鈕,這意味著這三個按鈕會從右向左依次排列;第三個 Frame 容器內包含三個從底部(BOTTOM)開始排列的按鈕,這意味著這三個按鈕會從下到上依次排列,且這三個按鈕能在垂直(Y)方向上填充。
運行上面程序,將看到如下圖所示的界面。
從上圖中可以看到,為運行效果添加了三個框,分別代表 fm1、fm2、fm3(實際上容器是看不到的),此時可以看到 fm1 內的三個按鈕從上到下排列,并且可以在水平方向上填充;fm3 內的三個按鈕從下到上排列,并且可以在垂直方向上填充。
可能有讀者會有疑問,fm2 內的三個按鈕也都設置了 fill=Y,expand=YES,這說明它們也能在垂直方向上填充,為啥舍看不到呢?仔細看 fm2.pack(side=LEFT, padx=10, expand= YES)這行代碼,它說明 fm2 本身不在任何方向上填充,因此 fm2 內的三個按鈕都不能填充。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。