3 import  wx
.lib
.anchors 
as anchors
 
   5 #---------------------------------------------------------------------- 
   7 # Nifty little trick here; apply wx.NewId() to generate a series of 
   8 # IDs used later on in the app.  
  10 [   ID_ANCHORSDEMOFRAMEANCHOREDPANEL
,  
  11     ID_ANCHORSDEMOFRAMEHELPSTATICTEXT
, 
  12     ID_ANCHORSDEMOFRAMEMAINPANEL
,  
  13     ID_ANCHORSDEMOFRAMEBACKGROUNDPANEL
, 
  14     ID_ANCHORSDEMOFRAMERIGHTCHECKBOX
,  
  15     ID_ANCHORSDEMOFRAMEOKBUTTON
, 
  16     ID_ANCHORSDEMOFRAMETOPCHECKBOX
,  
  17     ID_ANCHORSDEMOFRAMEBOTTOMCHECKBOX
, 
  19     ID_ANCHORSDEMOFRAMELEFTCHECKBOX
, 
  20  ] = map(lambda _init_ctrls
: wx
.NewId(), range(10)) 
  22 # A small note here: while only certain parts of this frame are actually demonstrating 
  23 # the capabilities of the LayoutAnchors feature, all the controls are within the same 
  24 # frame; therefore, all controls and windows within the frame must use LayoutAnchors. 
  25 # You can't mix LayoutAnchors and sizers. 
  26 class AnchorsDemoFrame(wx
.Frame
): 
  27     def _init_utils(self
): 
  30     def _init_ctrls(self
, prnt
): 
  32             self
, size
=(328, 187), id=ID_ANCHORSDEMOFRAME
,  
  33             title
='LayoutAnchors Demonstration', parent
=prnt
,  
  34             name
='AnchorsDemoFrame',  
  35             style 
= wx
.DEFAULT_FRAME_STYLE | wx
.CLIP_CHILDREN
, pos
=(261, 123) 
  40         self
.mainPanel 
= wx
.Panel( 
  41                             size
=(320, 160), parent
=self
,  
  42                             id=ID_ANCHORSDEMOFRAMEMAINPANEL
, name
='panel1',  
  43                             style
=wx
.TAB_TRAVERSAL | wx
.CLIP_CHILDREN
,  
  47         self
.mainPanel
.SetAutoLayout(True) 
  49         self
.okButton 
= wx
.Button( 
  50                             label
='OK', id=ID_ANCHORSDEMOFRAMEOKBUTTON
,  
  51                             parent
=self
.mainPanel
, name
='okButton',  
  52                             size
=(72, 24), style
=0, pos
=(240, 128) 
  55         self
.okButton
.SetConstraints( 
  56             anchors
.LayoutAnchors(self
.okButton
, False, False, True, True) 
  60             wx
.EVT_BUTTON
, self
.OnOkButtonButton
, id=ID_ANCHORSDEMOFRAMEOKBUTTON
 
  63         self
.backgroundPanel 
= wx
.Panel( 
  64                                 size
=(304, 80), parent
=self
.mainPanel
,  
  65                                 id=ID_ANCHORSDEMOFRAMEBACKGROUNDPANEL
,  
  66                                 name
='backgroundPanel',  
  67                                 style
=wx
.SIMPLE_BORDER | wx
.CLIP_CHILDREN
,  
  71         self
.backgroundPanel
.SetBackgroundColour(wx
.Colour(255, 255, 255)) 
  72         self
.backgroundPanel
.SetConstraints( 
  73             anchors
.LayoutAnchors(self
.backgroundPanel
, True, True, True, True) 
  76         self
.anchoredPanel 
= wx
.Panel( 
  77                                 size
=(88, 48), id=ID_ANCHORSDEMOFRAMEANCHOREDPANEL
,  
  78                                 parent
=self
.backgroundPanel
, name
='anchoredPanel',  
  79                                 style
=wx
.SIMPLE_BORDER
, pos
=(104, 16) 
  82         self
.anchoredPanel
.SetBackgroundColour(wx
.Colour(0, 0, 222)) 
  83         self
.anchoredPanel
.SetConstraints( 
  84             anchors
.LayoutAnchors(self
.anchoredPanel
, False, False, False, False) 
  87         self
.leftCheckBox 
= wx
.CheckBox( 
  88                                 label
='Left', id=ID_ANCHORSDEMOFRAMELEFTCHECKBOX
,  
  89                                 parent
=self
.mainPanel
, name
='leftCheckBox',  
  90                                 size
=(40, 16), style
=0, pos
=(8, 8) 
  93         self
.leftCheckBox
.SetConstraints( 
  94             anchors
.LayoutAnchors(self
.leftCheckBox
, False, True, False, False) 
  98             wx
.EVT_CHECKBOX
, self
.OnCheckboxCheckbox
, source
=self
.leftCheckBox
, 
  99             id=ID_ANCHORSDEMOFRAMELEFTCHECKBOX
 
 102         self
.topCheckBox 
= wx
.CheckBox( 
 103                             label
='Top', id=ID_ANCHORSDEMOFRAMETOPCHECKBOX
,  
 104                             parent
=self
.mainPanel
, name
='topCheckBox',  
 105                             size
=(40, 16), style
=0, pos
=(88, 8) 
 108         self
.topCheckBox
.SetConstraints( 
 109             anchors
.LayoutAnchors(self
.topCheckBox
, False, True, False, False) 
 113             wx
.EVT_CHECKBOX
, self
.OnCheckboxCheckbox
, source
=self
.topCheckBox
, 
 114             id=ID_ANCHORSDEMOFRAMETOPCHECKBOX
 
 117         self
.rightCheckBox 
= wx
.CheckBox( 
 118                             label
='Right', id=ID_ANCHORSDEMOFRAMERIGHTCHECKBOX
,  
 119                             parent
=self
.mainPanel
, name
='rightCheckBox',  
 120                             size
=(48, 16), style
=0, pos
=(168, 8) 
 123         self
.rightCheckBox
.SetConstraints( 
 124             anchors
.LayoutAnchors(self
.rightCheckBox
, False, True, False, False) 
 128             wx
.EVT_CHECKBOX
, self
.OnCheckboxCheckbox
, source
=self
.rightCheckBox
, 
 129             id=ID_ANCHORSDEMOFRAMERIGHTCHECKBOX
 
 132         self
.bottomCheckBox 
= wx
.CheckBox( 
 133                                 label
='Bottom', id=ID_ANCHORSDEMOFRAMEBOTTOMCHECKBOX
,  
 134                                 parent
=self
.mainPanel
, name
='bottomCheckBox',  
 135                                 size
=(56, 16), style
=0, pos
=(248, 8) 
 138         self
.bottomCheckBox
.SetConstraints( 
 139             anchors
.LayoutAnchors(self
.bottomCheckBox
, False, True, False, False) 
 143             wx
.EVT_CHECKBOX
, self
.OnCheckboxCheckbox
, source
=self
.bottomCheckBox
, 
 144             id=ID_ANCHORSDEMOFRAMEBOTTOMCHECKBOX
 
 147         self
.helpStaticText 
= wx
.StaticText( 
 148                                 label
='Select anchor options above, then resize window to see the effect',  
 149                                 id=ID_ANCHORSDEMOFRAMEHELPSTATICTEXT
,  
 150                                 parent
=self
.mainPanel
, name
='helpStaticText',  
 151                                 size
=(224, 24), style
=wx
.ST_NO_AUTORESIZE
,  
 155         self
.helpStaticText
.SetConstraints( 
 156             anchors
.LayoutAnchors(self
.helpStaticText
, True, False, True, True) 
 159     def __init__(self
, parent
): 
 160         self
._init
_ctrls
(parent
) 
 162     # Based on the values of the above checkboxes, we will adjust the layout constraints 
 163     # on the sample window whenever one of the checkboxes changes state. 
 164     def OnCheckboxCheckbox(self
, event
): 
 165         self
.anchoredPanel
.SetConstraints( 
 166             anchors
.LayoutAnchors(self
.anchoredPanel
, 
 167                           self
.leftCheckBox
.GetValue(), self
.topCheckBox
.GetValue(), 
 168                           self
.rightCheckBox
.GetValue(), self
.bottomCheckBox
.GetValue() 
 172     def OnOkButtonButton(self
, event
): 
 175 #---------------------------------------------------------------------- 
 177 def runTest(frame
, nb
, log
): 
 178     win 
= AnchorsDemoFrame(frame
) 
 185 #---------------------------------------------------------------------- 
 188 overview 
= """<html><body> 
 189 <h2>LayoutAnchors</h2> 
 190         A class that implements Delphi's Anchors with wxLayoutConstraints. 
 192         Anchored sides maintain the distance from the edge of the 
 193         control to the same edge of the parent. 
 194         When neither side is selected, the control keeps the same 
 195         relative position to both sides. 
 197         The current position and size of the control and it's parent 
 198         is used when setting up the constraints. To change the size or 
 199         position of an already anchored control, set the constraints to 
 200         None, reposition or resize and reapply the anchors. 
 204         Let's anchor the right and bottom edge of a control and 
 208         ctrl.SetConstraints(LayoutAnchors(ctrl, left=0, top=0, right=1, bottom=1)) 
 210         +=========+         +===================+ 
 213         | +--*--+ |         |           +-----+ | 
 216                             +-------------------+ 
 220         When anchored on both sides the control will stretch horizontally. 
 223         ctrl.SetConstraints(LayoutAnchors(ctrl, 1, 0, 1, 1)) 
 225         +=========+         +===================+ 
 228         | +--*--+ |         | +---------------+ | 
 229         +---------+         | *     ctrl      * | 
 230                             | +-------*-------+ | 
 231                             +-------------------+ 
 239 if __name__ 
== '__main__': 
 242     run
.main(['', os
.path
.basename(sys
.argv
[0])] + sys
.argv
[1:])