我們在圖形界面開發(fā)的時候往往要面臨一個如何布局的問題,一個合理的布局能夠把有面積的使用最大化,也能幫助使用者更直觀的使用界面,我們使用wxPython的時候可以采用兩種布局的形式,一種是前面我們用到的絕對布局,也就是說我們所創(chuàng)建的控件的位置是固定不變的,無論窗口的大小如何變化,絕對布局的子窗口或者控件都是不變的,本節(jié)我們學習一種Sizer管理布局,它能幫助我們自動布局一組窗口控件。
WxPython中有八種sizer供我們使用,分別是Sizer、WrapSizer、BoxSizer、GridSizer、FlexGridSizer、GridBagSizer和StaticBoxSzer、StdDialogButtonSizer,我們主要對BoxSizer進行學習。
它的分類如圖:
我們在日常使用的時候一般使用BoxSizer、StaticBoxSizer、GridSizer和FlexGridSizer這四種,繼承Sizer中的方法。
1. BoxSizer布局
BoxSizer布局是使用的幾種布局中最靈活簡便的一個,它的排布方式垂直或水平,一般是在創(chuàng)建的時候指定布局的方向。
my_box = wx.BoxSizer(wx.HORIZINTAL) My_box = wx.BoxSizer(wx.VERTICAL)
上面的屬于水平布局,當括號中為空的時候即默認為水平布局,下面的為垂直方向的布局。
我們往布局中添加控件的時候,使用Add()方法,這個Add方法由wx.Sizer繼承而來,它的語法格式為:
Add(parent,proportion=0,flag=0,border=0,userData=None)
這種方式添加到父窗口parent當中。
Add(AnotherSizer,proportion=0,flag=0,border=0,userData=None)
這種方式添加到另外一個布局當中。
Add(AnotherSizer,proportion=0,flag=0,border=0,userData=None)
這種方式創(chuàng)建了一個新的空間。
其中flag為對齊、邊框和尺寸參數(shù),border為邊框?qū)挾取?strong>userData為數(shù)據(jù)的傳輸。
flag對齊標志有多種:
標志 | 說明 |
ALIGN_TOP | 頂對齊 |
wx.ALIGN_LEFT | 左對齊 |
wx.ALIGN_BOTTOM | 底對齊 |
wx.ALIGN_RIGHT | 右對齊 |
wx.ALIGN_CENTER | 居中對齊 |
wx.ALIGN_CENTER_VERTIAL | 垂直居中對齊 |
wx.ALIGN_CENTER_HORIZONTAL | 水平居中對齊 |
邊框flag標志有:
標志 | 說明 |
wx.TOP | 設置有頂部邊框,邊框的寬度需要通過Add()方法的border參數(shù)設置 |
wx.BOTTOM | 設置有底部邊框 |
wx.LEFT | 設置有左邊框 |
wx.RIGHT | 設置有右邊框 |
wx.ALL | 設置4面全有邊框 |
調(diào)整尺寸flag標志:
標志 | 說明 |
wx.EXPAND | 調(diào)整子窗口(或控件)完全填滿有效空間 |
wx.SHAPED | 調(diào)整子窗口(或控件)填充有效空間,但保存高寬比 |
wx.FIXED_MINSIZE | 調(diào)整子窗口(或控件)為最小尺寸 |
wx.RESERVE_SPACE_EVEN_IF_HIDDEN | 設置此標志后,子窗口(或控件)如果被隱藏,所占空間保留 |
我們來使用BoxSizer布局來創(chuàng)建一個登陸界面:
import wx class MyFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, -1, "登錄界面", size=(300, 300)) panel = wx.Panel(self)#創(chuàng)建一個畫布,然后創(chuàng)建功能區(qū)并放到畫布上 self.title = wx.StaticText(panel,label = '登陸界面') self.username = wx.StaticText(panel,label = '用戶:') self.user_name = wx.TextCtrl(panel,style = wx.TE_LEFT) self.userpassword = wx.StaticText(panel,label = '密碼:') self.user_password = wx.TextCtrl(panel,style = wx.TE_PASSWORD) self.button_login = wx.Button(panel,label = '登陸') self.button_register = wx.Button(panel,label = '注冊') container_one = wx.BoxSizer(wx.HORIZONTAL) # 創(chuàng)建一個box容器并控制水平排列 container_one.Add(self.username,proportion = 0,flag = wx.ALL,border = 7) container_one.Add(self.user_name,proportion = 1,flag = wx.ALL,border = 7) container_two = wx.BoxSizer(wx.HORIZONTAL) # 創(chuàng)建一個box容器并控制水平排列 container_two.Add(self.userpassword,proportion = 0,flag = wx.ALL,border = 7) container_two.Add(self.user_password,proportion = 1,flag = wx.ALL,border = 7) container_three = wx.BoxSizer(wx.HORIZONTAL) # 創(chuàng)建一個box容器并控制水平排列 container_three.Add(self.button_login,proportion = 0,flag = wx.ALIGN_CENTER,border = 4) container_three.Add(self.button_register,proportion =0,flag = wx.ALIGN_CENTER,border = 4) sizers = wx.BoxSizer(wx.VERTICAL) sizers.Add(self.title,proportion=0,flag=wx.BOTTOM|wx.TOP|wx.ALIGN_CENTER,border=10) sizers.Add(container_one,proportion = 0,flag =wx.EXPAND|wx.LEFT|wx.RIGHT,border=40) sizers.Add(container_two, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=40) sizers.Add(container_three, proportion=0, flag=wx.ALIGN_CENTER|wx.TOP, border=10) panel.SetSizer(sizers) if __name__ == "__main__": app = wx.App() frame = MyFrame() frame.Show() app.MainLoop()
輸出結果如圖:
對應下圖:
在這個例子中,我們主要使用了豎直和水平兩種布局,我們首先把用戶和輸入信息放入一個水平BoxSizer,然后把密碼和輸入信息放入一個BoxSizer,再把兩個按鈕放在一個BoxSizer,最后再把四種信息全部放到一個豎直的BoxSizer當中。
2. 總結
布局是我們圖形界面開發(fā)的重要一環(huán),就好比在建造房子之前是一定要設計好圖紙的,所以我們先設計布局再進行頁面開發(fā)。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習題和答疑,點擊了解:
一點編程也不會寫的:零基礎C語言學練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學奧賽或C++選手的 必學C++課程
藍橋杯ACM、信息學奧賽的必學課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導課程