wxPython - BoxSizer

This sizer allows the controls to be arranged in row-wise or column-wise manner. BoxSizer’s layout is determined by its orientation argument (either wxVERTICAL or wxHORIZONTAL).
Box = wx.BoxSizer(wxHORIZONTAL)
Box = wx.BoxSizer(wxVERTICAL)

Add() method (inherited from wxSizer) appends it to the next row/column of the sizer.
Box.Add(control, proportion, flag, border)

The proportion parameter controls how the control changes it size in response to dimensions of the container. Combination of various flag parameters decides the appearance of control in the sizer. Following are some of the flags −
wx.EXPAND
Item will expand to fill the space provided to it (wx.GROW is the same)
wx.SHAPED
Similar to EXPAND but maintains the item's aspect ratio
wx.FIXED_MINSIZE
Does not let the item become smaller than its initial minimum size
wx.RESERVE_SPACE_EVEN_IF_ HIDDEN
Does not allow the sizer to reclaim an item's space when it is hidden
The border parameter is an integer, the space in pixels to be left between controls. For example,
b = wx.StaticText(self, -1, “Enter a number”) 
Box.Add(b,1,wx.ALL|wx.EXPAND,10) 
Following are some more methods of wx.BoxSizer class −
SetOrientation()
Sets orientation wxHORIZONTAL or wxVERTICAL
AddSpacer()
Adds nonstretchable space
AddStretchSpacer()
Adds stretchable space so that resizing the window will affect control size proportionately
Clear()
Removes children from sizer
Detach()
Removes a control from sizer without destroying
Insert()
Inserts a child control at a specified position
Remove()
Removes a child from sizer and destroys it
In the following code, a vertical box sizer is applied to a panel object which is placed inside wxFrame window.
p = wx.Panel(self) 
vbox = wx.wx.BoxSizer(wx.VERTICAL)

The first row in the box displays a label (wx.StaticText object) in the center with a border of 20 pixels around it.
l1 = wx.StaticText(p,label = "Enter a number",style = wx.ALIGN_CENTRE ) 
vbox.Add(l1,0,  wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL, 20)

In the second row, a wx.Button object is displayed. Because of wx.EXPAND flag it occupies the entire width of the window.
b1 = wx.Button(p, label = "Btn1") 
vbox.Add(b1,0, wx.EXPAND)

The next row also contains a button. It is not added with EXPAND flag. Instead, because of ALIGN_CENTER_HORIZONTAL, button with default size appears in the center horizontally.
b2 = wx.Button(p, label = "Btn2") 
vbox.Add(b2,0,wx.ALIGN_CENTER_HORIZONTAL)

In the next row, a TextCtrl object with proportion parameter set to 1 and EXPAND flag set is added. As a result, it is taller in size.
t = wx.TextCtrl(p) 
vbox.Add(t,1,wx.EXPAND,10)

The last row holds a horizontal sizer object, which in turn has a label and button separated by a stretchable space.
hbox = wx.BoxSizer(wx.HORIZONTAL) 
l2 = wx.StaticText(p,label = "Label2", style = wx.ALIGN_CENTRE) 
hbox.Add(l2,0,wx.EXPAND) 

b3 = wx.Button(p,label = "Btn3") 
hbox.AddStretchSpacer(1) 
hbox.Add(b3,0,wx.ALIGN_LEFT,20) 
vbox.Add(hbox,1,wx.ALL|wx.EXPAND)
Lastly, the vertical box sizer is applied to wx.Panel object.
Following is the complete code −
import wx 
 
class Example(wx.Frame): 
   
   def __init__(self, parent, title): 
      super(Example, self).__init__(parent, title = title, size = (200,300)) 
             
      self.InitUI() 
      self.Centre() 
      self.Show()
		
   def InitUI(self): 
      p = wx.Panel(self) 
      vbox = wx.wx.BoxSizer(wx.VERTICAL) 
      l1 = wx.StaticText(p,label = "Enter a number",style = wx.ALIGN_CENTRE ) 
      vbox.Add(l1,0,  wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL, 20) 
      b1 = wx.Button(p, label = "Btn1") 
      vbox.Add(b1,0,wx.EXPAND) 
          
      b2 = wx.Button(p, label = "Btn2") 
      vbox.Add(b2,0,wx.ALIGN_CENTER_HORIZONTAL) 
      t = wx.TextCtrl(p) 
      vbox.Add(t,1,wx.EXPAND,10) 
      hbox = wx.BoxSizer(wx.HORIZONTAL) 
      l2 = wx.StaticText(p,label = "Label2", style = wx.ALIGN_CENTRE) 
		
      hbox.Add(l2,0,wx.EXPAND) 
      b3 = wx.Button(p,label = "Btn3") 
      hbox.AddStretchSpacer(1) 
      hbox.Add(b3,0,wx.ALIGN_LEFT,20) 
      vbox.Add(hbox,1,wx.ALL|wx.EXPAND) 
      p.SetSizer(vbox) 
          
app = wx.App() 
Example(None, title = 'BoxSizer demo') 
app.MainLoop()
The above code produces the following output −
 Print
 Add Notes
 Bookmark this page