]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/TimeCtrl.py
   2 # 11/21/2003 - Jeff Grimmett (grimmtooth@softhome.net) 
   4 # o presense of spin control causing probs (see spin ctrl demo for details) 
   8 import wx
.lib
.scrolledpanel    
as scrolled
 
   9 import wx
.lib
.masked           
as masked
 
  11 #---------------------------------------------------------------------- 
  13 class TestPanel( scrolled
.ScrolledPanel 
): 
  14     def __init__( self
, parent
, log 
): 
  16         scrolled
.ScrolledPanel
.__init
__( self
, parent
, -1 ) 
  20         text1 
= wx
.StaticText( self
, -1, "12-hour format:") 
  21         self
.time12 
= masked
.TimeCtrl( self
, -1, name
="12 hour control" ) 
  22         spin1 
= wx
.SpinButton( self
, -1, wx
.DefaultPosition
, (-1,20), 0 ) 
  23         self
.time12
.BindSpinButton( spin1 
) 
  25         text2 
= wx
.StaticText( self
, -1, "24-hour format:") 
  26         spin2 
= wx
.SpinButton( self
, -1, wx
.DefaultPosition
, (-1,20), 0 ) 
  27         self
.time24 
= masked
.TimeCtrl( 
  28                         self
, -1, name
="24 hour control", fmt24hr
=True, 
  32         text3 
= wx
.StaticText( self
, -1, "No seconds\nor spin button:") 
  33         self
.spinless_ctrl 
= masked
.TimeCtrl( 
  34                                 self
, -1, name
="spinless control", 
  35                                 display_seconds 
= False 
  38         grid 
= wx
.FlexGridSizer( 0, 2, 10, 5 ) 
  39         grid
.Add( text1
, 0, wx
.ALIGN_RIGHT 
) 
  40         hbox1 
= wx
.BoxSizer( wx
.HORIZONTAL 
) 
  41         hbox1
.Add( self
.time12
, 0, wx
.ALIGN_CENTRE 
) 
  42         hbox1
.Add( spin1
, 0, wx
.ALIGN_CENTRE 
) 
  43         grid
.Add( hbox1
, 0, wx
.LEFT 
) 
  45         grid
.Add( text2
, 0, wx
.ALIGN_RIGHT|wx
.TOP|wx
.BOTTOM 
) 
  46         hbox2 
= wx
.BoxSizer( wx
.HORIZONTAL 
) 
  47         hbox2
.Add( self
.time24
, 0, wx
.ALIGN_CENTRE 
) 
  48         hbox2
.Add( spin2
, 0, wx
.ALIGN_CENTRE 
) 
  49         grid
.Add( hbox2
, 0, wx
.LEFT 
) 
  51         grid
.Add( text3
, 0, wx
.ALIGN_RIGHT|wx
.TOP|wx
.BOTTOM 
) 
  52         grid
.Add( self
.spinless_ctrl
, 0, wx
.LEFT 
) 
  55         buttonChange 
= wx
.Button( self
, -1, "Change Controls") 
  56         self
.radio12to24 
= wx
.RadioButton( 
  57                             self
, -1, "Copy 12-hour time to 24-hour control", 
  58                             wx
.DefaultPosition
, wx
.DefaultSize
, wx
.RB_GROUP
 
  61         self
.radio24to12 
= wx
.RadioButton( 
  62                             self
, -1, "Copy 24-hour time to 12-hour control" 
  65         self
.radioWx 
= wx
.RadioButton( self
, -1, "Set controls to 'now' using wxDateTime") 
  66         self
.radioMx 
= wx
.RadioButton( self
, -1, "Set controls to 'now' using mxDateTime") 
  68         radio_vbox 
= wx
.BoxSizer( wx
.VERTICAL 
) 
  69         radio_vbox
.Add( self
.radio12to24
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.ALL
, 5 ) 
  70         radio_vbox
.Add( self
.radio24to12
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.ALL
, 5 ) 
  71         radio_vbox
.Add( self
.radioWx
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.ALL
, 5 ) 
  72         radio_vbox
.Add( self
.radioMx
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.ALL
, 5 ) 
  74         box_label 
= wx
.StaticBox( self
, -1, "Change Controls through API" ) 
  75         buttonbox 
= wx
.StaticBoxSizer( box_label
, wx
.HORIZONTAL 
) 
  76         buttonbox
.Add( buttonChange
, 0, wx
.ALIGN_CENTRE|wx
.ALL
, 5 ) 
  77         buttonbox
.Add( radio_vbox
, 0, wx
.ALIGN_CENTRE|wx
.ALL
, 5 ) 
  79         hbox 
= wx
.BoxSizer( wx
.HORIZONTAL 
) 
  80         hbox
.Add( grid
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 15 ) 
  81         hbox
.Add( buttonbox
, 0, wx
.ALIGN_RIGHT|wx
.BOTTOM
, 20 ) 
  84         box_label 
= wx
.StaticBox( self
, -1, "Bounds Control" ) 
  85         boundsbox 
= wx
.StaticBoxSizer( box_label
, wx
.HORIZONTAL 
) 
  86         self
.set_bounds 
= wx
.CheckBox( self
, -1, "Set time bounds:" ) 
  88         minlabel 
= wx
.StaticText( self
, -1, "minimum time:" ) 
  89         self
.min = masked
.TimeCtrl( self
, -1, name
="min", display_seconds 
= False ) 
  90         self
.min.Enable( False ) 
  92         maxlabel 
= wx
.StaticText( self
, -1, "maximum time:" ) 
  93         self
.max = masked
.TimeCtrl( self
, -1, name
="max", display_seconds 
= False ) 
  94         self
.max.Enable( False ) 
  96         self
.limit_check 
= wx
.CheckBox( self
, -1, "Limit control" ) 
  98         label 
= wx
.StaticText( self
, -1, "Resulting time control:" ) 
  99         self
.target_ctrl 
= masked
.TimeCtrl( self
, -1, name
="new" ) 
 101         grid2 
= wx
.FlexGridSizer( 0, 2, 0, 0 ) 
 102         grid2
.Add( (20, 0), 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 103         grid2
.Add( (20, 0), 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 105         grid2
.Add( self
.set_bounds
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 106         grid3 
= wx
.FlexGridSizer( 0, 2, 5, 5 ) 
 107         grid3
.Add(minlabel
, 0, wx
.ALIGN_RIGHT|wx
.ALIGN_CENTER_VERTICAL 
) 
 108         grid3
.Add( self
.min, 0, wx
.ALIGN_LEFT 
) 
 109         grid3
.Add(maxlabel
, 0, wx
.ALIGN_RIGHT|wx
.ALIGN_CENTER_VERTICAL 
) 
 110         grid3
.Add( self
.max, 0, wx
.ALIGN_LEFT 
) 
 111         grid2
.Add(grid3
, 0, wx
.ALIGN_LEFT 
) 
 113         grid2
.Add( self
.limit_check
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 114         grid2
.Add( (20, 0), 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 116         grid2
.Add( (20, 0), 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 117         grid2
.Add( (20, 0), 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 118         grid2
.Add( label
, 0, wx
.ALIGN_LEFT|wx
.ALIGN_CENTER_VERTICAL|wx
.ALL
, 5 ) 
 119         grid2
.Add( self
.target_ctrl
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 120         boundsbox
.Add(grid2
, 0, wx
.ALIGN_CENTER|wx
.EXPAND|wx
.ALL
, 5) 
 122         vbox 
= wx
.BoxSizer( wx
.VERTICAL 
) 
 124         vbox
.Add( hbox
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5) 
 125         vbox
.Add( boundsbox
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 128         outer_box 
= wx
.BoxSizer( wx
.VERTICAL 
) 
 129         outer_box
.Add( vbox
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5) 
 132         # Turn on mxDateTime option only if we can import the module: 
 134             from mx 
import DateTime
 
 136             self
.radioMx
.Enable( False ) 
 139         self
.SetAutoLayout( True ) 
 140         self
.SetSizer( outer_box 
) 
 141         outer_box
.Fit( self 
) 
 142         self
.SetupScrolling() 
 144         self
.Bind(wx
.EVT_BUTTON
, self
.OnButtonClick
, buttonChange 
) 
 145         self
.Bind(masked
.EVT_TIMEUPDATE
, self
.OnTimeChange
, self
.time12 
) 
 146         self
.Bind(masked
.EVT_TIMEUPDATE
, self
.OnTimeChange
, self
.time24 
) 
 147         self
.Bind(masked
.EVT_TIMEUPDATE
, self
.OnTimeChange
, self
.spinless_ctrl 
) 
 148         self
.Bind(wx
.EVT_CHECKBOX
, self
.OnBoundsCheck
, self
.set_bounds 
) 
 149         self
.Bind(wx
.EVT_CHECKBOX
, self
.SetTargetMinMax
, self
.limit_check 
) 
 150         self
.Bind(masked
.EVT_TIMEUPDATE
, self
.SetTargetMinMax
, self
.min ) 
 151         self
.Bind(masked
.EVT_TIMEUPDATE
, self
.SetTargetMinMax
, self
.max ) 
 152         self
.Bind(masked
.EVT_TIMEUPDATE
, self
.OnTimeChange
, self
.target_ctrl 
) 
 155     def OnTimeChange( self
, event 
): 
 156         timectrl 
= self
.FindWindowById( event
.GetId() ) 
 157         ib_str 
= [ "  (out of bounds)", "" ] 
 159         self
.log
.write('%s time = %s%s\n' % ( timectrl
.GetName(), timectrl
.GetValue(), ib_str
[ timectrl
.IsInBounds() ] ) ) 
 162     def OnButtonClick( self
, event 
): 
 163         if self
.radio12to24
.GetValue(): 
 164             self
.time24
.SetValue( self
.time12
.GetValue() ) 
 166         elif self
.radio24to12
.GetValue(): 
 167             self
.time12
.SetValue( self
.time24
.GetValue() ) 
 169         elif self
.radioWx
.GetValue(): 
 170             now 
= wx
.DateTime_Now() 
 171             self
.time12
.SetValue( now 
) 
 172             # (demonstrates that G/SetValue returns/takes a wx.DateTime) 
 173             self
.time24
.SetValue( self
.time12
.GetValue(as_wxDateTime
=True) ) 
 175             # (demonstrates that G/SetValue returns/takes a wx.TimeSpan) 
 176             self
.spinless_ctrl
.SetValue( self
.time12
.GetValue(as_wxTimeSpan
=True) ) 
 178         elif self
.radioMx
.GetValue(): 
 179             from mx 
import DateTime
 
 181             self
.time12
.SetValue( now 
) 
 183             # (demonstrates that G/SetValue returns/takes a DateTime) 
 184             self
.time24
.SetValue( self
.time12
.GetValue(as_mxDateTime
=True) ) 
 186             # (demonstrates that G/SetValue returns/takes a DateTimeDelta) 
 187             self
.spinless_ctrl
.SetValue( self
.time12
.GetValue(as_mxDateTimeDelta
=True) ) 
 190     def OnBoundsCheck( self
, event 
): 
 191         self
.min.Enable( self
.set_bounds
.GetValue() ) 
 192         self
.max.Enable( self
.set_bounds
.GetValue() ) 
 193         self
.SetTargetMinMax() 
 196     def SetTargetMinMax( self
, event
=None ): 
 200         if self
.set_bounds
.GetValue(): 
 201             min = self
.min.GetWxDateTime() 
 202             max = self
.max.GetWxDateTime() 
 204             min, max = None, None 
 206         cur_min
, cur_max 
= self
.target_ctrl
.GetBounds() 
 208         if min and (min != cur_min
): self
.target_ctrl
.SetMin( min ) 
 209         if max and (max != cur_max
): self
.target_ctrl
.SetMax( max ) 
 211         self
.target_ctrl
.SetLimited( self
.limit_check
.GetValue() ) 
 213         if min != cur_min 
or max != cur_max
: 
 214             new_min
, new_max 
= self
.target_ctrl
.GetBounds() 
 216             if new_min 
and new_max
: 
 217                 self
.log
.write( "current min, max:  (%s, %s)\n" % ( new_min
.FormatTime(), new_max
.FormatTime() ) ) 
 219                 self
.log
.write( "current min, max:  (None, None)\n" ) 
 221 #---------------------------------------------------------------------- 
 223 def runTest( frame
, nb
, log 
): 
 224     win 
= TestPanel( nb
, log 
) 
 227 #---------------------------------------------------------------------- 
 228 import wx
.lib
.masked
.timectrl 
as timectl
 
 229 overview 
= timectl
.__doc
__ 
 231 if __name__ 
== '__main__': 
 234     run
.main(['', os
.path
.basename(sys
.argv
[0])])