wxpython 布局管理

一个典型的应用程序是由不同的部件。这些小部件被放进容器部件。一个程序员必须管理应用程序的布局。这不是一项容易的任务。在wxPython我们有两个选择。

*absolute positioning
*sizers

Absolute Positioning绝对位置

程序员指定位置和大小的每个小部件以像素为单位。当你使用绝对定位,你必须了解一些事情。

1.如果你改变窗口大小,大小和位置的一个小部件不改变

2.在各种平台上的应用程序看起来不同

3.更改字体在您的应用程序可能会破坏布局

4.如果你决定改变你的布局,你必须完全重做你的布局,这是繁琐又费时

可能存在的情况下,我们可能使用绝对定位。例如,我的教程。我不想使示例太难了,所以我经常使用绝对定位来解释一个主题。但是最重要的是,在现实世界的程序,程序员使用sizer。

在我们的例子中,我们有一个简单的文本编辑器骨架。如果我们调整窗口大小,因为我们希望wx.TextCtrl的大小不会改变。

    

[python] view plain copy

  1. ‘‘‘‘‘
  2. Created on 2012-7-1
  3. @author: Administrator
  4. ‘‘‘
  5. import wx
  6. class Example(wx.Frame):
  7. def __init__(self,parent,title):
  8. super(Example,self).__init__(parent,title=title,size=(260,180))
  9. self.InitUI()
  10. self.Centre()
  11. self.Show()
  12. def InitUI(self):
  13. panel = wx.Panel(self, -1)
  14. menuBar = wx.MenuBar()
  15. filem = wx.Menu()
  16. editm = wx.Menu()
  17. helpm = wx.Menu()
  18. menuBar.Append(filem,"&File")
  19. menuBar.Append(editm,"&Edit")
  20. menuBar.Append(helpm,"&Help")
  21. self.SetMenuBar(menuBar)
  22. wx.TextCtrl(panel,pos=(3,3),size=(250,150))
  23. if __name__ == ‘__main__‘:
  24. app = wx.App()
  25. Example(None,title=‘Layout1‘)
  26. app.MainLoop()

在上面的示例中,我们的位置文本控制在绝对坐标。

[python] view plain copy

  1. wx.TextCtrl(panel, pos=(3, 3), size=(250, 150))

我们构造的wx.TextCtrl的使用绝对定位。在我们的例子中,我们定位在X = 3,Y = 3的wx.TextCtrl。宽度为250像素,高度为150px。

Using sizers使用sizers

Sizers do address all those issues, we mentioned by absolute positioning. We can choose among these sizers:

我们可以选择下列sizers:

1.wx.BoxSizer

2.wx.StaticBoxSizer

3.wx.GridSizer

4.wx.FlexGridSizer

5.wx.GridBagSizer

[python] view plain copy

  1. import wx
  2. class Example(wx.Frame):
  3. def __init__(self,parent,title):
  4. super(Example,self).__init__(parent,title=title,size=(260,180))
  5. self.InitUI()
  6. self.Centre()
  7. self.Show()
  8. def InitUI(self):
  9. menuBar = wx.MenuBar()
  10. filem = wx.Menu()
  11. editm = wx.Menu()
  12. helpm = wx.Menu()
  13. menuBar.Append(filem,"&File")
  14. menuBar.Append(editm,"&Edit")
  15. menuBar.Append(helpm,"&Help")
  16. self.SetMenuBar(menuBar)
  17. wx.TextCtrl(self)
  18. if __name__ == ‘__main__‘:
  19. app = wx.App()
  20. Example(None,title=‘Layout1‘)
  21. app.MainLoop()

在这个例子中,没有用到sizer。我们wx.Frame的部件放在一个wx.TextCtrl。 wx.Frame的部件有一个特殊的内置SIZER。我们可以把wx.Frame的容器内,只有一个窗口。子部件占据所有的空间.

wx.BoxSizer

This sizer enables us to put several widgets into a row or a column. We can put another sizer into an existing sizer. This way we can create very complex layouts.

sizer可以放置很多部件到行或者行。也可以放置其它sizer。这样我们可以创建非常复杂的界面。

[python] view plain copy

  1. box = wx.BoxSizer(integer orient)
  2. box.Add(wx.Window window, integer proportion=0, integer flag = 0, integer border = 0)

方向可以wx.VERTICAL或wx.HORIZONTAL的。添加到wx.BoxSizer部件是通过Add()方法。为了了解它,我们需要来看看它的参数。

比例参数定义的部件,将如何定义的方向改变的比例。假设我们有三个按钮的比例0,1??和2。它们被添加成水平wx.BoxSizer。按钮0比例不会改变。按钮比例2比1的水平尺寸比例更将改变两次。

与标志参数可以进一步配置在wx.BoxSizer的小部件的行为。我们可以控制的部件之间的边界。我们添加了一些像素部件之间的空间。为了适用边界,我们需要定义的两侧,将用于边境。我们可以结合| e.g wx.LEFT| wx.BOTTOM。我们可以选择这些标志:

1.wx.LEFT

2.wx.RIGHT

3.wx.BOTTOM

4.wx.TOP

5.wx.ALL


[python] view plain copy

  1. ‘‘‘‘‘
  2. Created on 2012-7-2
  3. @author: Administrator
  4. ‘‘‘
  5. import wx
  6. class Example(wx.Frame):
  7. def __init__(self,parent,title):
  8. super(Example,self).__init__(parent,title=title,size=(260,180))
  9. self.InitUI()
  10. self.Centre()
  11. self.Show()
  12. def InitUI(self):
  13. panel = wx.Panel(self)
  14. panel.SetBackgroundColour(‘#4f5049‘)
  15. vbox = wx.BoxSizer(wx.VERTICAL)
  16. midPan = wx.Panel(panel)
  17. midPan.SetBackgroundColour(‘#ededed‘)
  18. vbox.Add(midPan,2,wx.EXPAND|wx.ALL,40)
  19. panel.SetSizer(vbox)
  20. if __name__ == ‘__main__‘:
  21. app = wx.App()
  22. Example(None,title="Border")
  23. app.MainLoop()

[python] view plain copy

  1. vbox.Add(midPan, 1, wx.EXPAND | wx.ALL, 20)

我们放在围绕midPan面板20 PX边界。 wx.ALL适用于所有四边边框大小。

如果我们使用wx.EXPAND标志,我们的部件将使用所有已分配给它的空间。最后,我们还可以定义我们的部件对齐。我们做了以下标志:

1.wx.ALIGN_LEFT
2.wx.ALIGN_RIGHT
3.wx.ALIGN_TOP
4.wx.ALIGN_BOTTOM
5.wx.ALIGN_CENTER_VERTICAL
6.wx.ALIGN_CENTER_HORIZONTAL
7.wx.ALIGN_CENTER

Go To Class

In the following example we introduce several important ideas.

在接下来的例子中,我们介绍了几种重要的方法。

[python] view plain copy

  1. ‘‘‘‘‘
  2. Created on 2012-7-2
  3. @author: Administrator
  4. ‘‘‘
  5. import wx
  6. class Example(wx.Frame):
  7. def __init__(self,parent,title):
  8. super(Example,self).__init__(parent,title=title,size=(500,300))
  9. self.InitUI()
  10. self.Centre()
  11. self.Show()
  12. def InitUI(self):
  13. panel = wx.Panel(self)
  14. font = wx.SystemSettings_GetFont(wx.SYS_SYSTEM_FONT)
  15. font.SetPointSize(9)
  16. vbox = wx.BoxSizer(wx.VERTICAL)
  17. hbox1 = wx.BoxSizer(wx.HORIZONTAL)
  18. st1 = wx.StaticText(panel,label=‘Class Name‘)
  19. st1.SetFont(font)
  20. hbox1.Add(st1,flag=wx.RIGHT,border=8)
  21. tc = wx.TextCtrl(panel)
  22. hbox1.Add(tc,proportion=1)
  23. vbox.Add(hbox1,flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP,border=10)
  24. vbox.Add((-1,10))
  25. hbox3 = wx.BoxSizer(wx.HORIZONTAL)
  26. tc2 = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
  27. hbox3.Add(tc2, proportion=1, flag=wx.EXPAND)
  28. vbox.Add(hbox3, proportion=1, flag=wx.LEFT|wx.RIGHT|wx.EXPAND,
  29. border=10)
  30. vbox.Add((-1, 25))
  31. hbox4 = wx.BoxSizer(wx.HORIZONTAL)
  32. cb1 = wx.CheckBox(panel, label=‘Case Sensitive‘)
  33. cb1.SetFont(font)
  34. hbox4.Add(cb1)
  35. cb2 = wx.CheckBox(panel, label=‘Nested Classes‘)
  36. cb2.SetFont(font)
  37. hbox4.Add(cb2, flag=wx.LEFT, border=10)
  38. cb3 = wx.CheckBox(panel, label=‘Non-Project classes‘)
  39. cb3.SetFont(font)
  40. hbox4.Add(cb3, flag=wx.LEFT, border=10)
  41. vbox.Add(hbox4, flag=wx.LEFT, border=10)
  42. vbox.Add((-1, 25))
  43. hbox5 = wx.BoxSizer(wx.HORIZONTAL)
  44. btn1 = wx.Button(panel, label=‘Ok‘, size=(70, 30))
  45. hbox5.Add(btn1)
  46. btn2 = wx.Button(panel, label=‘Close‘, size=(70, 30))
  47. hbox5.Add(btn2, flag=wx.LEFT|wx.BOTTOM, border=5)
  48. vbox.Add(hbox5, flag=wx.ALIGN_RIGHT|wx.RIGHT, border=10)
  49. panel.SetSizer(vbox)
  50. if __name__ == ‘__main__‘:
  51. app = wx.App()
  52. Example(None,title="gotoclass")
  53. app.MainLoop()

布局很简单。我们创建一个垂直sizer。然后放置五个横的sizers。

[python] view plain copy

  1. font = wx.SystemSettings_GetFont(wx.SYS_SYSTEM_FONT)
  2. font.SetPointSize(9)

字体设置为9 px。

[python] view plain copy

  1. vbox.Add(hbox3, proportion=1, flag=wx.LEFT|wx.RIGHT|wx.EXPAND,
  2. border=10)
  3. vbox.Add((-1, 25))

我们已经知道,我们可以控制部件之间的距离相结合的与边境参数标志参数。但有一个约束条件。在Add()方法,我们可以指定只为一个边界的所有各方。在我们的例子中,我们给10px的右侧和左侧。但是,如果省略wx.BOTTOM,我们不能给25 PX至底部。我们能做的是给10px底部,或0px。因此,如果我们需要不同的值,我们可以添加一些额外的空间。 Add()方法,我们可以插入25px的空白空间。

[python] view plain copy

  1. vbox.Add(hbox5, flag=wx.ALIGN_RIGHT|wx.RIGHT, border=10)

我们放置在窗口右侧的两个按钮。怎么对齐呢?proportion必须为0,按钮尺寸也不能改变,我们不能指定wx.EXPAND参数。那么我们指定wx.ALIGN_RIGHT与wx.RIGHT。

wx.GridSizer

wx.GridSizer是一个二维表格,每个表格大小相同。

[python] view plain copy

  1. wx.GridSizer(int rows=1, int cols=0, int vgap=0, int hgap=0)

在构造函数中,我们指定数量的行和列的表。和垂直和水平表格之间的空间。

下边是一个不完美的计算器示例:

[python] view plain copy

  1. ‘‘‘‘‘
  2. Created on 2012-7-2
  3. @author: Administrator
  4. ‘‘‘
  5. import wx
  6. class Example(wx.Frame):
  7. def __init__(self,parent,title):
  8. super(Example,self).__init__(parent,title=title,size=(300,250))
  9. self.InitUI()
  10. self.Centre()
  11. self.Show()
  12. def InitUI(self):
  13. menubar = wx.MenuBar()
  14. fileMenu = wx.Menu()
  15. menubar.Append(fileMenu,"&File")
  16. self.SetMenuBar(menubar)
  17. vbox = wx.BoxSizer(wx.VERTICAL)
  18. self.display = wx.TextCtrl(self,style=wx.TE_RIGHT)
  19. vbox.Add(self.display,flag=wx.EXPAND|wx.TOP|wx.BOTTOM,border=5)
  20. gs = wx.GridSizer(4,4,5,5)
  21. gs.AddMany( [(wx.Button(self, label=‘Cls‘), 0, wx.EXPAND),
  22. (wx.Button(self, label=‘Bck‘), 0, wx.EXPAND),
  23. (wx.StaticText(self), wx.EXPAND),
  24. (wx.Button(self, label=‘Close‘), 0, wx.EXPAND),
  25. (wx.Button(self, label=‘7‘), 0, wx.EXPAND),
  26. (wx.Button(self, label=‘8‘), 0, wx.EXPAND),
  27. (wx.Button(self, label=‘9‘), 0, wx.EXPAND),
  28. (wx.Button(self, label=‘/‘), 0, wx.EXPAND),
  29. (wx.Button(self, label=‘4‘), 0, wx.EXPAND),
  30. (wx.Button(self, label=‘5‘), 0, wx.EXPAND),
  31. (wx.Button(self, label=‘6‘), 0, wx.EXPAND),
  32. (wx.Button(self, label=‘*‘), 0, wx.EXPAND),
  33. (wx.Button(self, label=‘1‘), 0, wx.EXPAND),
  34. (wx.Button(self, label=‘2‘), 0, wx.EXPAND),
  35. (wx.Button(self, label=‘3‘), 0, wx.EXPAND),
  36. (wx.Button(self, label=‘-‘), 0, wx.EXPAND),
  37. (wx.Button(self, label=‘0‘), 0, wx.EXPAND),
  38. (wx.Button(self, label=‘.‘), 0, wx.EXPAND),
  39. (wx.Button(self, label=‘=‘), 0, wx.EXPAND),
  40. (wx.Button(self, label=‘+‘), 0, wx.EXPAND) ])
  41. vbox.Add(gs,proportion=1,flag=wx.EXPAND)
  42. self.SetSizer(vbox)
  43. if __name__ == ‘__main__‘:
  44. app = wx.App()
  45. Example(None,title="caculator")
  46. app.MainLoop()

我们用wx.StaticText控件在 Bck 与 Close之间做了个空白。然后用AddMany()方法

[python] view plain copy

  1. gs.AddMany( [(wx.Button(self, label=‘Cls‘), 0, wx.EXPAND),
  2. ...

控件按顺序依次放入表格,第一行填满后,继续第二行。

wx.FlexGridSizer

这SIZER类似wx.GridSizer。它也有二维表的部件。但它增加了一些灵活性。 wx.GridSizer表格是相同的大小。在wx.FlexGridSizer 所有的行和列的不一定是相同的高度或宽度。

[python] view plain copy

  1. wx.FlexGridSizer(int rows=1, int cols=0, int vgap=0, int hgap=0)

rows和cols指定行和列的数目。 VAP和HAP添加一些在两个方向上的小部件之间的空间。

很多时候,开发商要开发用于数据输入和修改的对话框。我觉得这样一个任务wx.FlexGridSizer合适。开发人员可以很容易地建立一个对话窗口,因为约束,每个单元必须具有相同的大小。

[python] view plain copy

  1. ‘‘‘‘‘
  2. Created on 2012-7-2
  3. @author: Administrator
  4. ‘‘‘
  5. import wx
  6. class Example(wx.Frame):
  7. def __init__(self,parent,title):
  8. super(Example,self).__init__(parent,title=title,size=(300,250))
  9. self.InitUI()
  10. self.Centre()
  11. self.Show()
  12. def InitUI(self):
  13. panel = wx.Panel(self)
  14. hbox = wx.BoxSizer(wx.HORIZONTAL)
  15. fgs = wx.FlexGridSizer(3,2,9,25)
  16. title = wx.StaticText(panel,label=‘Title:‘)
  17. author = wx.StaticText(panel,label=‘Author:‘)
  18. review = wx.StaticText(panel,label=‘Review‘)
  19. tc1 = wx.TextCtrl(panel)
  20. tc2 = wx.TextCtrl(panel)
  21. tc3 = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
  22. fgs.AddMany([(title),(tc1,1,wx.EXPAND),(author),
  23. (tc2,1,wx.EXPAND),(review,1,wx.EXPAND),(tc3,1,wx.EXPAND)])
  24. fgs.AddGrowableRow(2,1)
  25. fgs.AddGrowableCol(1,1)
  26. hbox.Add(fgs,proportion=1,flag=wx.ALL|wx.EXPAND,border=15)
  27. panel.SetSizer(hbox)
  28. if __name__ == ‘__main__‘:
  29. app = wx.App()
  30. Example(None,title="FlexGridSizer.py")
  31. app.MainLoop()

[python] view plain copy

  1. hbox = wx.BoxSizer(wx.HORIZONTAL)
  2. ...
  3. hbox.Add(fgs, proportion=1, flag=wx.ALL|wx.EXPAND, border=15)

我们建立了一个横向的hbox,周围放置15px的空白。

[python] view plain copy

  1. fgs.AddMany([(title), (tc1, 1, wx.EXPAND), (author),
  2. (tc2, 1, wx.EXPAND), (review, 1, wx.EXPAND), (tc3, 1, wx.EXPAND)])

然后用 AddMany() 这个方法。

[python] view plain copy

  1. fgs.AddGrowableRow(2, 1)
  2. fgs.AddGrowableCol(1, 1)

我们创建一个可自动伸缩的三行两列,前两个文本控件将在水平方向上伸缩,第三个将在两个方向伸缩。不要忘记,使用部件的扩展(wx.EXPAND),以使其真正发挥作用。

wx.GridBagSizer

在wxPython中最复杂Sizer要属它了。许多程序员发现很难使用。这样sizer是不是只对wxPython的典型,其它语言也有它。即使它是比较复杂,也不难攻克。

wx.GridBagSizer有一个简单的构造:

[python] view plain copy

  1. wx.GridBagSizer(integer vgap, integer hgap)

子控件之间用垂直与水平定义,然后用Add()方法添加:

[python] view plain copy

  1. Add(self, item, tuple pos, tuple span=wx.DefaultSpan, integer flag=0,
  2. integer border=0, userData=None)

插入表格中的控件,有pos指定位置,(0,0)表标左上方的表格。span(跨度)为可选。下面两种方法可以伸缩:

[python] view plain copy

  1. AddGrowableRow(integer row)
  2. AddGrowableCol(integer col)

[python] view plain copy

  1. ‘‘‘‘‘
  2. Created on 2012-7-2
  3. @author: Administrator
  4. ‘‘‘
  5. import wx
  6. class Example(wx.Frame):
  7. def __init__(self,parent,title):
  8. super(Example,self).__init__(parent,title=title,size=(320,130))
  9. self.InitUI()
  10. self.Centre()
  11. self.Show()
  12. def InitUI(self):
  13. panel = wx.Panel(self)
  14. sizer = wx.GridBagSizer(4,4)
  15. text = wx.StaticText(panel,label=‘Rename to‘)
  16. sizer.Add(text,pos=(0,0),flag=wx.TOP|wx.LEFT|wx.BOTTOM,border=5)
  17. tc = wx.TextCtrl(panel)
  18. sizer.Add(tc,pos=(0,1),span=(1,5),flag=wx.EXPAND|wx.LEFT|wx.RIGHT,border=5)
  19. buttonOK = wx.Button(panel,label=‘OK‘,size=(90,28))
  20. buttonClose = wx.Button(panel,label=‘Close‘,size=(90,28))
  21. sizer.Add(buttonOK,pos=(3,3))
  22. sizer.Add(buttonClose,pos=(3,4),flag=wx.RIGHT|wx.BOTTOM,border=5)
  23. sizer.AddGrowableRow(2)
  24. sizer.AddGrowableCol(1)
  25. panel.SetSizerAndFit(sizer)
  26. if __name__ == ‘__main__‘:
  27. app = wx.App()
  28. Example(None,title="FlexGridSizer.py")
  29. app.MainLoop()

我们必须把它看作是一个大的网格状的表

[python] view plain copy

  1. text = wx.StaticText(panel, label="Rename To")
  2. sizer.Add(text, pos=(0, 0), flag=wx.TOP|wx.LEFT|wx.BOTTOM, border=5)

“Rename To”这个标签设置在左上角(0,0)位置,然后在它上、左、下旋转5pix 的空白。

[python] view plain copy

  1. tc = wx.TextCtrl(panel)
  2. sizer.Add(tc, pos=(1, 0), span=(1, 5),
  3. flag=wx.EXPAND|wx.LEFT|wx.RIGHT, border=5)

wx.TextCtrl放置在(1,0)这个位置,然后有个(1,5)的跨度,在它左、右放置5pix的空白,并且wx.EXPAND可伸展。

[python] view plain copy

  1. sizer.Add(buttonOk, pos=(3, 3))
  2. sizer.Add(buttonClose, pos=(3, 4), flag=wx.RIGHT|wx.BOTTOM, border=5)

第四行放置两个按钮,第三行为空。注意:我们并没有在两个按钮之间设置空隙。wx.GridBagSizer创建之处,各个控件之间已经有空隙了。

[python] view plain copy

  1. sizer.AddGrowableCol(1)
  2. sizer.AddGrowableRow(2)

最后,我们必须要做的事情,是让我们的对话框大小。我们把第二列第三行可增长。现在我们可以扩大或缩小我们的窗口。尝试看看些两行,看看会发生什么。

下面我们来做一个java程序员新建类的窗口:

 

[python] view plain copy

  1. ‘‘‘‘‘
  2. Created on 2012-7-2
  3. @author: Administrator
  4. ‘‘‘
  5. import wx
  6. class Example(wx.Frame):
  7. def __init__(self,parent,title):
  8. super(Example,self).__init__(parent,title=title,size=(450,350))
  9. self.InitUI()
  10. self.Centre()
  11. self.Show()
  12. def InitUI(self):
  13. panel = wx.Panel(self)
  14. sizer = wx.GridBagSizer(5,5)
  15. text1 = wx.StaticText(panel,label="Java Class")
  16. sizer.Add(text1, pos=(0,0),flag=wx.TOP|wx.LEFT|wx.BOTTOM,border=15)
  17. icon = wx.StaticBitmap(panel,bitmap=wx.Bitmap("exit.png"))
  18. sizer.Add(icon,pos=(0,4),flag=wx.TOP|wx.RIGHT|wx.ALIGN_RIGHT,border=5)
  19. line = wx.StaticLine(panel)
  20. sizer.Add(line,pos=(1,0),span=(1,5),flag=wx.EXPAND|wx.BOTTOM,border=10)
  21. text2 = wx.StaticText(panel,label="Name")
  22. sizer.Add(text2,pos=(2,0),flag=wx.LEFT,border=10)
  23. tc1 = wx.TextCtrl(panel)
  24. sizer.Add(tc1,pos=(2,1),span=(1,3),flag=wx.TOP|wx.EXPAND)
  25. text3 = wx.StaticText(panel, label="Package")
  26. sizer.Add(text3, pos=(3, 0), flag=wx.LEFT|wx.TOP, border=10)
  27. tc2 = wx.TextCtrl(panel)
  28. sizer.Add(tc2, pos=(3, 1), span=(1, 3), flag=wx.TOP|wx.EXPAND,
  29. border=5)
  30. button1 = wx.Button(panel, label="Browse...")
  31. sizer.Add(button1, pos=(3, 4), flag=wx.TOP|wx.RIGHT, border=5)
  32. text4 = wx.StaticText(panel, label="Extends")
  33. sizer.Add(text4, pos=(4, 0), flag=wx.TOP|wx.LEFT, border=10)
  34. combo = wx.ComboBox(panel)
  35. sizer.Add(combo, pos=(4, 1), span=(1, 3),
  36. flag=wx.TOP|wx.EXPAND, border=5)
  37. button2 = wx.Button(panel, label="Browse...")
  38. sizer.Add(button2, pos=(4, 4), flag=wx.TOP|wx.RIGHT, border=5)
  39. sb = wx.StaticBox(panel, label="Optional Attributes")
  40. boxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL)
  41. boxsizer.Add(wx.CheckBox(panel, label="Public"),
  42. flag=wx.LEFT|wx.TOP, border=5)
  43. boxsizer.Add(wx.CheckBox(panel, label="Generate Default Constructor"),
  44. flag=wx.LEFT, border=5)
  45. boxsizer.Add(wx.CheckBox(panel, label="Generate Main Method"),
  46. flag=wx.LEFT|wx.BOTTOM, border=5)
  47. sizer.Add(boxsizer, pos=(5, 0), span=(1, 5),
  48. flag=wx.EXPAND|wx.TOP|wx.LEFT|wx.RIGHT , border=10)
  49. button3 = wx.Button(panel, label=‘Help‘)
  50. sizer.Add(button3, pos=(7, 0), flag=wx.LEFT, border=10)
  51. button4 = wx.Button(panel, label="Ok")
  52. sizer.Add(button4, pos=(7, 3))
  53. button5 = wx.Button(panel, label="Cancel")
  54. sizer.Add(button5, pos=(7, 4), span=(1, 1),
  55. flag=wx.BOTTOM|wx.RIGHT, border=5)
  56. sizer.AddGrowableCol(2)
  57. panel.SetSizer(sizer)
  58. if __name__ == ‘__main__‘:
  59. app = wx.App()
  60. Example(None,title="Newclass.py")
  61. app.MainLoop()

这是一个复杂的布局.我们同时用了wx.GridBagSizer 和 wx.StaticBoxsizer.

[python] view plain copy

  1. line = wx.StaticLine(panel)
  2. sizer.Add(line, pos=(1, 0), span=(1, 5),
  3. flag=wx.EXPAND|wx.BOTTOM, border=10)

这是一条线,用于单独的组内的小部件的布局。

[python] view plain copy

  1. icon = wx.StaticBitmap(panel, bitmap=wx.Bitmap(‘exec.png‘))
  2. sizer.Add(icon, pos=(0, 4), flag=wx.TOP|wx.RIGHT|wx.ALIGN_RIGHT,
  3. border=5)

我们把wx.StaticBitmap图标控件放在右边的行。

[python] view plain copy

  1. sb = wx.StaticBox(panel, label="Optional Attributes")
  2. boxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL)

wxStaticBoxSizer 像一个普通的wx.BoxSizer,但它会添加一个静态框。

时间: 2024-10-22 13:48:21

wxpython 布局管理的相关文章

wxpython布局管理部件wx.gridbagsizer用法示例

text = ("This is text box")         panel = wx.Panel(self, -1)         chkAll1 = wx.CheckBox(panel, ID_CHKBOX_CAN_SEL_ALL, u'全选')                chkKnown = wx.CheckBox(panel, ID_CHKBOX_CAN_UNKNOWN, u'不会')         chkUnknow = wx.CheckBox(panel, I

wxPython布局管理器(sizer)学习(1)

个人认为学习GUI程序开发,最重要的两个基础点就是:事件处理和界面布局.事件处理能够让你在界面上的控件被鼠标.按键等触发的时候做出合适的响应,比如点击“保存”按钮之后弹出标准的文件保存对话框.另外一件重要的就是界面的布局,之所以要有GUI程序,就是为了有良好的用户体验,如果一个软件界面布局乱七八糟的话,肯定是不合适的.至于按钮.文本框.静态文本这些组件,不过是通过相应的类产生实例并用Add之类的方法添加到面板上而已. wxPython的sizer是用于自动布局一组窗口(之前提到过GUI程序开发中

QT开发(二十一)——QT布局管理器

QT开发(二十一)--QT布局管理器 一.布局管理器简介 QT中使用绝对定位的布局方式无法自适应窗口的变化. QT中提供了对界面组件进行布局管理的类,用于对界面组件进行管理,能够自动排列窗口中的界面组件,窗口大小变化后自动更新界面组件的大小. QLayout是QT中布局管理器的抽象基类,通过对QLayout的继承,实现了功能各异且互补的布局管理器. 布局管理器不是界面组件,而是界面组件的定位策略. 任意容器类型的组件都可以指定布局管理器. 同一个布局管理器管理中的组件拥有相同的父组件,在设置布局

【Swing 2】布局管理器上

很苦逼的是,每次想记录一个小程序,发现,要给别人讲清楚,总是得分很多模块讲解. 所以今天来讲下Swing组件的三大布局管理器. 参考:<Head First Java>第十三章 1. BorderLayout--边界布局 2. FlowLayout--顺序布局 3. BoxLayout--不知道叫啥 1. BorderLayout(边界布局) 该管理器把背景分成东南西北中五大块,这是框架默认的布局管理器 1 package demo; 2 3 import javax.swing.*; 4 i

JAVA GUI布局管理器

边界布局管理器: a.布局方式:是把整个容器划分为五个部分.东西南北中,南北要贯通,中间最大 (不仅是中间的范围最大,权利也最大)当周边不存在的时候中间会占领周边,当中间不存在的时候周边不能占据中间 b.使用场景:不是用来直接放组件,而是用来放置子容器(中间容器)的 流布局管理器 : FlowFrame a.布局方式:是按从左往右,从上往下,由中间开始的方式依次排放组件,组件大小根据组件内容确定,组件的位置会随着容器大小的改变而改变 b.使用场景:用来放置组件,而不是用来放中间容器,流布局最好只

Qt布局管理器综合实例

1.布局管理器的综合实例------模拟向导用户界面(Windows平台) -----练习开发一个向导用户界面 @1:在同一界面上展现不同的向导页面 @2:通过上一步和下一步按钮进行切换 @3:不同页面上的元素组件和这些组件排布都不相同 @4:页面中的组件通过布局管理进行排布 (1)通过布局嵌套进行界面设计 @1:上一步和下一步这两个按钮用水平布局管理器QHBoxLayout来进行管理,不同页面上的显示的内容只有按钮不变,所以讲不同页面的内容用栈式布局管理器QStackedLayout进行管理,

PyQt5教程——布局管理(4)

PyQt5中的布局管理 布局管理是GUI编程中的一个重要方面.布局管理是一种如何在应用窗口上防止组件的一种方法.我们可以通过两种基础方式来管理布局.我们可以使用绝对定位和布局类. 绝对定位 程序指定了组件的位置并且每个组件的大小用像素作为单位来丈量.当你使用了绝对定位,我们需要知道下面的几点限制: 如果我们改变了窗口大小,组件的位置和大小并不会发生改变. 在不同平台上,应用的外观可能不同 改变我们应用中的字体的话可能会把应用弄得一团糟. 如果我们决定改变我们的布局,我们必须完全重写我们的布局,这

第22课 布局管理器(一)

1. 绝对定位及存在的问题 (1)直接在像素级指定各个组件的位置和大小 void QWidget::move(int x, int y) void QWidget::resize(int w, int h); (2)存在问题:组件的位置和大小无法自适应父窗口的变化 2. 布局管理器 (1)提供相关的类对界面组件进行布局管理 ①能够自动排列窗口中的界面组件 ②窗口变化后自动更新界面组件的大小 (2)QLayout是Qt中布局管理器的抽象基类 (3)通过继承QLayout实现了功能各异且互补的布局管

JAVA 边界布局管理器

//边界布局管理器 import java.awt.*; import javax.swing.*; public class Jiemian1 extends JFrame{ //定义组件 JButton an1,an2,an3,an4,an5; public static void main(String[] args){ //运行本类的构造方法 Jiemian1 jiemian = new Jiemian1(); } public Jiemian1(){ //创建按钮 an1 = new