对于初学者,
wxPython的布局定位是有点麻烦,需要仔细查看官方文档。(原文:
wiki.wxpython.org/learnSizer3.py)
以下是我学习过程中实现的实例,以便与大家共同交流:)
1. wx.BoxSizer() 在wxPython定位构件程中使用最多最直观的sizer.
原型:
它还有以下常用到的方法:
1. wx.BoxSizer() 在wxPython定位构件程中使用最多最直观的sizer.
- wx.BoxSizer.__init__(self,
orient) - sizer
= wx.BoxSizer(wx.HORIZONTAL) #创建一个水平方向的box ; wx.VERTICAL ,垂直方向的box
- Add(self,
item, proportion, flag, border, userData) - Insert(self,
before, item, proportion, flag, border, userData, realIndex) - Layout(self)
- Prepend(self,
item, proportion, flag, border, userData) - Remove(self,
indx, pop) - Show(self,
item, show)
- .
- .
- .
- (原文: http://www.wxpython.org/docs/api/wx.BoxSizer-class.html)
- def
__init__(self, parent): -
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize) -
-
wred = wx.TextCtrl(self, wx.NewId()) -
wwhite = wx.TextCtrl(self, wx.NewId()) -
wblue = wx.TextCtrl(self, wx.NewId()) -
wcyan = wx.TextCtrl(self, wx.NewId()) -
b1 = wx.Button(self, wx.NewId(), '&OK') -
b2 = wx.Button(self, wx.NewId(), '&Canel') -
st = wx.StaticText(self, -1, 'new flexgridsizer') -
-
"""hgap, vgap = 0, 0 -
nrows, ncols = 2, 3 -
fgs = wx.FlexGridSizer(nrows, ncols, hgap, vgap) -
-
b = 5 -
fgs.AddMany([(wred, 1, wx.EXPAND | wx.ALL, b), -
(wwhite, 1, wx.EXPAND | wx.ALL, b), -
(wblue, 1, wx.EXPAND | wx.ALL, b), -
(wcyan, 1, wx.EXPAND | wx.ALL,b), -
(b1, 0, wx.ALIGN_RIGHT), -
(b2, 0, wx.ALIGN_LEFT | wx.LEFT, b), -
]) -
fgs.AddGrowableRow(0) -
fgs.AddGrowableRow(1) -
fgs.AddGrowableCol(0) -
fgs.AddGrowableCol(1) -
fgs.AddGrowableCol(2)""" -
-
b = 0 -
hsizer1 = wx.BoxSizer(wx.HORIZONTAL) -
hsizer1.Add(wred, 0, wx.ALL, b) -
hsizer1.Add((-1, -1), 1) -
hsizer1.Add(wwhite, 0, wx.ALL, b) -
hsizer1.Add((-1, -1), 1) -
hsizer1.Add(wblue, 0, wx.ALL, b) -
-
vsizer1 = wx.BoxSizer(wx.VERTICAL) -
vsizer1.Add(wcyan, 0, wx.ALL, b) -
vsizer1.SetItemMinSize(wcyan, (100, 200)) # 设置widgets min size -
vsizer1.Add((-1, -1), 1) -
vsizer1.Add(b1, 0, wx.ALL, b) -
vsizer1.Add((-1, -1), 1) -
vsizer1.Add(b2, 0, wx.ALL, b) -
-
hgap, vgap = 0, 0 -
nrows, ncols = 2, 2 -
fgs = wx.FlexGridSizer(nrows, ncols, hgap, vgap) -
-
b =5 -
fgs.AddMany([(vsizer1, 1, wx.EXPAND | wx.ALL, b), -
(st, 1, wx.EXPAND | wx.ALL, b), -
((-1, -1), 1, wx.EXPAND | wx.ALL, b), -
(hsizer1, 1, wx.EXPAND | wx.ALL, b), -
]) -
fgs.AddGrowableRow(0) # 第1行扩展 -
fgs.AddGrowableCol(1) # 第2列扩展 -
-
-
self.SetSizer(fgs)
3. wx.GridBagSizer()该类是wx.FlexGridSizer()的子类,它具有其父类的方法与属性,当然,它使用时比其父类更简单了。它不需要指定特定的行数与列数,完整根据它所管理的构件设置具体而定的。
原型:
实例3:
Note: 实例3中就表示形成了一个三行四列的虚拟表格(如果再添加一个gbs.Add(item, (4, 6), (1, 1) ....)那么它就是五行七列的).AddGrowableRow()与AddGrowable()表示指定的idx行或指定的idx列伸缩.
4. wx.StaticBoxSizer() 此使用方法与wx.BoxSizer()基本相同,就不多说。
(原型: http://www.wxpython.org/docs/api/wx.StaticBoxSizer-class.html)
总结: wxPython进行布局定位,我现在就学习了这四种方法,至于其他的方法,以后学习了再补充完整。在实际的运用中,不能单靠某一种方法,往往是多种方法配合使用,才能发挥所长,使代码更简洁,界面更美观等等.以上纯属个人观点,有些说法或写法不准确之处,还望指教,多谢!
原型:
- #构造函数
- __init__(self,
vgap=0, hgap=0) - (Constructor)
-
- Constructor,
with optional parameters to specify the gap between the rows and columns. -
-
Parameters: -
vgap -
(type=int) -
-
hgap -
(type=int) -
- #添加单个构件到boxsizer
- #
pos 表示的单元格的点(cell position可以看做是坐标) - #
span 表示的单个或合并的单元格 - Add(self,
item, pos, span=DefaultSpan, flag=0, border=0, userData=None) -
- Adds
an item to the sizer at the grid cell pos, optionally spanning more than one row or column as specified with span. The remaining args behave similarly to wx.Sizer.Add. -
- Returns
True if the item was successfully placed at the given cell position, False if something was already there. -
-
Parameters: -
pos -
(type=GBPosition) -
-
span -
(type=GBSpan) -
-
flag -
(type=int) -
-
border -
(type=int) - .
- .
- .
- (原文:
http://www.wxpython.org/docs/api/wx.GridBagSizer-class.html)
实例3:
- def
__init__(self, parent): -
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize) -
wred = wx.TextCtrl(self, wx.NewId(), 'red') -
wwhite = wx.TextCtrl(self, wx.NewId(), 'white') -
wblue = wx.TextCtrl(self, wx.NewId()) -
wcyan = wx.TextCtrl(self, wx.NewId()) -
-
vgap, hgap = 10, 20 -
gbs = wx.GridBagSizer(vgap, hgap) -
-
b = 0 -
# Add(self, item, pos, span=DefaultSpan, flag=0, border=0, userData=None) -
# pos (type=GBPosition) cell position -
# span(type=GBSPan) -
gbs.Add(wred, (1, 1), (1, 1), wx.EXPAND | wx.ALL, b) -
gbs.Add(wwhite, (2, 3), (1, 1), wx.EXPAND | wx.ALL, b) -
gbs.Add(wblue, (1, 0), (1, 1), wx.EXPAND | wx.ALL, b) -
gbs.Add(wcyan, (0, 0), (1, 1), wx.EXPAND | wx.ALL, b) -
-
gbs.AddGrowableRow(0) # 0/1/2...表示的行号或列号 -
gbs.AddGrowableRow(1) -
gbs.AddGrowableRow(2) -
gbs.AddGrowableCol(0) -
gbs.AddGrowableCol(1) -
gbs.AddGrowableCol(3) -
-
self.SetSizer(gbs)
Note: 实例3中就表示形成了一个三行四列的虚拟表格(如果再添加一个gbs.Add(item, (4, 6), (1, 1) ....)那么它就是五行七列的).AddGrowableRow()与AddGrowable()表示指定的idx行或指定的idx列伸缩.
4. wx.StaticBoxSizer() 此使用方法与wx.BoxSizer()基本相同,就不多说。
总结: wxPython进行布局定位,我现在就学习了这四种方法,至于其他的方法,以后学习了再补充完整。在实际的运用中,不能单靠某一种方法,往往是多种方法配合使用,才能发挥所长,使代码更简洁,界面更美观等等.以上纯属个人观点,有些说法或写法不准确之处,还望指教,多谢!