Python Gui編程,tkinter佈局管理器之pack

GUI 編程就相當於小孩子搭積木,每個積木塊應該放在哪裡,每個積木塊顯示為多大,也就是對大小和位置都需要進行管理,而佈局管理器正是負責管理各組件的大小和位置的。此外,當用戶調整了窗口的大小之後,佈局管理器還會自動調整窗口中各組件的大小和位置。

Tkinter 中,有 3 種佈局管理器,分別為 pack、grid 和 place。本節先介紹 pack 佈局管理器。使用 Pack 佈局各個組件,當程序向容器中添加組件時,這些組件會依次向後排列,排列方向既可是水平的,也可是垂直的。

下面程序簡單示範了 Pack 佈局的用法,該程序向窗口中添加了三個 Label 組件:

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 佈局。運行該程序,可以看到如下所示的界面:

Python Gui編程,tkinter佈局管理器之pack

上圖使用的是默認的 Pack 佈局,實際上程序在調用 pack() 方法時,可傳入多個選項,下面表格中羅列出了一些常用的選項以及各自的功能。

Python Gui編程,tkinter佈局管理器之pack

pack 佈局管理器支持的選項,可以通過 help(tkinter.Label.pack) 命令來查看,有興趣的讀者可自行查看。

當程序界面比較複雜時,就需要使用多個容器(Frame)分開佈局,然後再將 Frame 添加到窗口中。例如如下程序:

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中添加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)方向上填充。程序運行結果如下

Python Gui編程,tkinter佈局管理器之pack

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

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

如果希望看到 fm2 內的三個按鈕也能在垂直方向上填充,則可將 fm2 的 pack() 方法改為如下代碼:

fm2.pack(side=LEFT, padx=10, fill=BOTH, expand=YES)

再次運行結果如下:

Python Gui編程,tkinter佈局管理器之pack

通過上面介紹不難發現,Pack 佈局其實還是非常靈活的,它完全可以實現很複雜的用戶界面。這裡有一個界面分解的常識需要說明,無論看上去多麼複雜、古怪的界面,其實大多可分解為水平排列和垂直排列,而 Pack 佈局既可實現水平排列,也可實現垂直排列,然後再通過多個容器進行組合,這樣就可以開發出更復雜的界面了。

對於打算使用 Pack 佈局的開發者來說,首先要做的事情是將程序界面進行分解,分解成水平排列的容器和垂直排列的容器(有時候甚至要容器嵌套容器),然後使用多個 Pack 佈局的容器將它們組合在一起。


分享到:


相關文章: