下面咱們會介紹Grid、Box、Static box三種佈局方式。python
Grid:一個十分基礎的網格佈局。當你要放置的窗口部件都是一樣的尺寸且整齊地放入一個規則的網格中是使用它。算法
一個grid sizer是類wx.GridSizer的一個實例。app
構造函數顯式地設置四個屬性:框架
wx.GridSizer(rows, columns, vgap, hgap) yii
rows:建立多少行 ide
columns:建立多少列函數
vgap:兩相鄰列間的間隔的象素量 oop
hgap:兩相鄰行間的間隔的象素量佈局
grid sizer中每一個空格的尺寸是相同的,即便每一個窗口部件的尺寸不一樣,grid sizer最適合用於全部子窗口相同尺寸的狀況。spa
wx.GridSizer 類經常使用方法:
import wx class Example(wx.Frame): def __init__(self, parent, title): super(Example, self).__init__(parent, title=title, size=(300, 200)) self.InitUI() self.Centre() self.Show() def InitUI(self): p = wx.Panel(self) gs = wx.GridSizer(4, 4, 5, 5) for i in range(1, 17): btn = "Btn" + str(i) gs.Add(wx.Button(p, label=btn), 0, wx.EXPAND) p.SetSizer(gs)#把GridSizer與框架關聯起來 app = wx.App() Example(None, title='Grid Demo - www.yiibai.com') app.MainLoop()
box:一個box sizer是一個垂直列或水平行,窗口部件在其中從左至右或從上到下佈置在一條線上。
box sizer是類wx.BoxSizer的實例,wx.BoxSizer是wx.Sizer的子類,相對於wx.Sizer,wx.BoxSizer幾乎沒有增長新的方法。
wx.BoxSizer的構造函數有一個參數:
wx.BoxSizer(orient)
參數orient表明該sizer的方向,它的取值能夠是wx.VERTICAL或wx.HORIZONTAL。
建立垂直與水平盒子:
Box1 = wx.BoxSizer(wxHORIZONTAL)
Box2 = wx.BoxSizer(wxVERTICAL)
box sizer是wxPython所提供的sizer中的最簡單和最靈活的sizer。
wx.BoxSizer 類的經常使用方法:
import wx class Mywin(wx.Frame): def __init__(self, parent, title): super(Mywin, self).__init__(parent, title=title,size=(600, 400)) panel1 = wx.Panel(self) #垂直盒子 vbox = wx.BoxSizer(wx.VERTICAL) #水平盒子 nmbox = wx.BoxSizer(wx.HORIZONTAL) #建立兩個靜態文本 fn = wx.StaticText(panel1, -1, label="電影名稱:") ln = wx.StaticText(panel1, -1,label="選擇片源:") #建立兩個輸入框 self.nm1 = wx.TextCtrl(panel1, -1,size = (200,20),style=wx.ALIGN_LEFT) #在水平盒子裏添加上面三個 nmbox.Add(fn, 0, wx.ALL| wx.EXPAND, 5) nmbox.Add(self.nm1, 0, wx.ALL|wx.EXPAND, 5) nmbox.Add(ln, 0, wx.ALL|wx.EXPAND, 5) #建立下拉框 self.languages = ['電影天堂', '80S電影網', '1905電影網', 'BT天堂', '龍部落','電影港','人人字幕組'] self.choice =self.languages[0] self.combo = wx.ComboBox(panel1, choices=self.languages,value=self.languages[0]) #在水平盒子添加下拉框 nmbox.Add(self.combo, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 5) #建立按鈕 self.find_Button = wx.Button(panel1, label="查詢") self.Bind(wx.EVT_BUTTON, self.Onclick, self.find_Button) #在水平盒子裏添加查詢按鈕 nmbox.AddSpacer(20) nmbox.Add(self.find_Button, 0, wx.ALIGN_CENTER_HORIZONTAL) #在垂直盒子裏添加水平盒子 vbox.Add(nmbox, 0, wx.ALL | wx.CENTER, 5) multiLabel = wx.StaticText(panel1, -1, "查詢結果:") vbox.Add(multiLabel, 0, wx.ALL | wx.EXPAND, 5) # 建立文本域 self.multiText = wx.TextCtrl(panel1, -1,size=(200, 200), style=wx.TE_MULTILINE) # 建立一個文本控件 self.multiText.SetInsertionPoint(0) # 設置插入點 # 在垂直盒子裏添加文本域 vbox.Add(self.multiText, 1, wx.ALL | wx.EXPAND , 5) panel1.SetSizer(vbox) self.Show() def Onclick(self,event): print(self.choice) self.multiText.write(self.choice+"\n") app = wx.App() Mywin(None, '快搜') app.MainLoop()
重點介紹的是box的add方法:
Box.Add(size, proportion, flag, border)
size:須要添加的窗口。
border:參數是整數,設置控件之間間隔像素空間。
proportion:參數控制的控件響應於所述容器的尺寸改變其大小。
flag:參數的組合決定控件在sizer的外觀。
對齊標誌
wx.ALIGN_TOP
wx.ALIGN_BOTTO
Mwx.ALIGN_LEFT
wx.ALIGN_RIGHT
wx.ALIGN_CENTER_VERTICAL
wx.ALIGN_CENTER_HORIZONTAL
邊界標誌
wx.TOP
wx.BOTTOM
wx.LEFT
wx.RIGHT
wx.ALL
行爲標誌
wx.EXPAND 項目將擴大,以填補提供給它的空間(wx.GROW是同樣的)
wx.SHAPED 與EXPAND類似,但保持了項目的高寬比
wx.FIXED_MINSIZE 不容許該項目變得比其最初的最小尺寸更小
wx.RESERVE_SPACE_EVEN_IF_ HIDDEN 不容許測量器(sizer)回收項目空間,當它被隱藏時
box sizer的佈局算法對待該sizer的主方向(當構建的時候已被它的方向參數所定義)和次要方向是不一樣的。特別地,proportion參數只適用於當sizer沿主
方向伸縮時,而wx.EXPAND標記僅適用於當sizer的尺寸在次方向上變化時。換句話說,當一個垂直的box sizer被垂直地繪製時,傳遞給每一個Add()方法調用的
參數proportion決定了每一個項目將如何垂直地伸縮。除了影響sizer和它的項目的水平增加外,參數proportion以一樣的方式影響水平的box sizer。在另外一方面,
次方向的增加是由對項目所使用的wx.EXPAND標記來控制的,因此,在一個垂直的box sizer中的項目將只在水平方向增加,若是它們設置了wx.EXPAND標記的話,
不然這些項目保持它們的最小或最合適的尺寸。
Static box :一個static box合併了box sizer和靜態框(static box),靜態框在sizer的周圍提供了一個漂亮的邊框和文本標籤。
static box sizer是類wx.StaticBoxSizer的實例,wx.StaticBoxSizer是wx.BoxSizer的子類。
它的構造函數要求的參數是靜態框和方向:
wx.StaticBoxSizer(box, orient)
orient:意義與原wx.BoxSizer相同。
box:是一個wx.StaticBox。
wx.StaticBox類有一個用於wxPython控件的標準的構造函數,可是其中許多參數都有默認值,能夠忽略。
wx.StaticBox(parent, id, label, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, name=」staticBox」)
使用一個static box sizer,你不須要去設置pos, size, style, 或name參數,由於位置和尺寸將由sizer管理,而且沒用單獨用於wx.StaticBox的樣式。這使得構
造更簡單:
box = wx.StaticBox(self.panel, -1, boxlabel)
步驟:
import wx class Mywin(wx.Frame): def __init__(self, parent, title): super(Mywin, self).__init__(parent, title=title) #建立白板 panel = wx.Panel(self) #建立垂直與水平box盒子 vbox = wx.BoxSizer(wx.VERTICAL) nmbox = wx.BoxSizer(wx.HORIZONTAL) # 建立一個wx.StaticBox對象。 # 聲明一個wx.StaticBoxSizer與建立的wx.StaticBox對象做爲其參數。 nm = wx.StaticBox(panel, -1, 'Name:') nmSizer = wx.StaticBoxSizer(nm, wx.VERTICAL) #構建靜態文本框與輸入框 fn = wx.StaticText(panel, -1, "First Name") nm1 = wx.TextCtrl(panel, -1, style=wx.ALIGN_LEFT) ln = wx.StaticText(panel, -1, "Last Name") nm2 = wx.TextCtrl(panel, -1, style=wx.ALIGN_LEFT) #在水平盒子裏添加進上面四個 nmbox.Add(fn, 0, wx.ALL | wx.CENTER, 5) nmbox.Add(nm1, 0, wx.ALL | wx.CENTER, 5) nmbox.Add(ln, 0, wx.ALL | wx.CENTER, 5) nmbox.Add(nm2, 0, wx.ALL | wx.CENTER, 5) #在StaticBoxSizer添加進水平盒子 nmSizer.Add(nmbox, 0, wx.ALL | wx.CENTER, 10) #在垂直盒子裏添加StaticBoxSizer盒子 vbox.Add(nmSizer, 0, wx.ALL | wx.CENTER, 5) panel.SetSizer(vbox) self.Centre() panel.Fit() self.Show() # 關係: # 垂直box盒子添加StaticBoxSizer盒子 # StaticBoxSizer盒子添加水平盒子 app = wx.App() Mywin(None, 'StaticBoxSizer') app.MainLoop()