我們目前已經學會了四個控件,也編出了幾個窗口實例,它們都有一個共同的特點,就是丑,主要原因是沒有進行合理地布局。
此前的布局方式簡單粗暴,即明確規定每個控件的大小和位置,從而使之固定。這種布局方式可稱之為絕對定位布局,缺點是控件尺寸固定,并不會隨著窗口的放縮而同步變化。而且所有的控件都處于同一層次中,邏輯混亂,難于修改。
一個比較初級但很直觀的想法是,我們可不可以按照比例來調整控件的布局?我等菜鳥所能想到的需求,彼等大佬自然早已解決,BoxSizer便是為此而生。
我們可以將BoxSizer理解為一個容器或者一個箱子,里面的控件要么水平排列,要么豎直排列。而且BoxSizer之間也可以互相嵌套,從而實現一種非常靈活的布局方式。如圖所示:
在上圖中,第一步,將按鈕0、1、2裝進一個BoxSizer;將3、4、5、6裝入第二個BoxSizer;再將7-11裝入第三個BoxSizer。這三個BoxSizer都是橫向的。
第二步,將這三個BoxSizer裝入一個縱向的BoxSizer中。
第三步,再將這個縱向的BoxSizer與按鈕12裝入主BoxSizer中。于是這個布局便完成了。
其代碼如下,為了表現清晰,所以并沒有寫得很精簡。
import wxclass testBox(wx.Frame): def __init__(self,parent=None): wx.Frame.__init__(self,parent=parent) #生成12個按鈕 btns = [wx.Button(self,label=str(i)) for i in range(13)] myStyle = wx.EXPAND|wx.ALL #設置裝填風格 #左側第一行的BoxSizer box1 = wx.BoxSizer() for i in range(3): box1.Add(btns[i],1,myStyle,border=10) #左側第二行的BoxSizer box2 = wx.BoxSizer() for i in range(3,7): box2.Add(btns[i],1,myStyle,border=10) #左側第三行的BoxSizer box3 = wx.BoxSizer() for i in range(7,12): box3.Add(btns[i],1,myStyle,border=10) #左側BoxSizer,wx.VERTICAL表示這個BoxSizer為縱向 leftBox = wx.BoxSizer(wx.VERTICAL) leftBox.Add(box1,1,myStyle,border=10) leftBox.Add(box2,1,myStyle,border=10) leftBox.Add(box3,1,myStyle,border=10) #總BoxSizer mainBox = wx.BoxSizer() mainBox.Add(leftBox,1,myStyle,border=10) mainBox.Add(btns[12],1,myStyle,border=10) #在框架中設置mainBox self.SetSizer(mainBox)class MyApp(wx.App): def OnInit(self): self.SetAppName("testbox") self.Frame = testBox() self.Frame.Show() return Trueif __name__ == "__main__": test = MyApp() test.MainLoop()
wx.BoxSizer控件除了self之外,只有一個初始化參數,即orient,默認為wx.HORIZONTAL,即橫向;如果輸入wx.VERTICAL,則為縱向。
wx.BoxSizer通過Add方法裝填控件,其常用的調用格式為:
Add (self, window, proportion=0, flag=0, border=0)window為BoxSizer所裝填的控件 proportion聲明這個控件的尺寸是否隨著窗口的放縮而改變,如果改變的話其比例為多少 flag聲明裝填風格,如果想擁有多種風格,風格之間用"|"連接 border為邊界間隔
其中,proportion的參數為0時,表示尺寸不變;為正整數時,分別按照這個值的比例進行縮放。
Flags相對來說比較復雜,常用的可選值大致有三類,分別是聲明邊界、聲明對齊和聲明填充。
Add方法通過wx.TOP、wx.BOTTOM、wx.LEFT、wx.RIGHT、wx.ALL來聲明邊界。例如,如果選擇了wx.LEFT,即說明左側的邊界寬度為border。
新聞熱點
疑難解答