]>
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 ) 
  19         box_label 
= wx
.StaticBox( self
, -1, "Change Controls through API" ) 
  20         buttonbox 
= wx
.StaticBoxSizer( box_label
, wx
.HORIZONTAL 
) 
  22         text1 
= wx
.StaticText( self
, -1, "12-hour format:") 
  23         self
.time12 
= masked
.TimeCtrl( self
, -1, name
="12 hour control" ) 
  24         h 
= self
.time12
.GetSize().height
 
  25         spin1 
= wx
.SpinButton( self
, -1, wx
.DefaultPosition
, (-1,h
), wx
.SP_VERTICAL 
) 
  26         self
.time12
.BindSpinButton( spin1 
) 
  28         text2 
= wx
.StaticText( self
, -1, "24-hour format:") 
  29         spin2 
= wx
.SpinButton( self
, -1, wx
.DefaultPosition
, (-1,h
), wx
.SP_VERTICAL 
) 
  30         self
.time24 
= masked
.TimeCtrl( 
  31                         self
, -1, name
="24 hour control", fmt24hr
=True, 
  35         text3 
= wx
.StaticText( self
, -1, "No seconds\nor spin button:") 
  36         self
.spinless_ctrl 
= masked
.TimeCtrl( 
  37                                 self
, -1, name
="spinless control", 
  38                                 display_seconds 
= False 
  41         grid 
= wx
.FlexGridSizer( 0, 2, 10, 5 ) 
  42         grid
.Add( text1
, 0, wx
.ALIGN_RIGHT 
) 
  43         hbox1 
= wx
.BoxSizer( wx
.HORIZONTAL 
) 
  44         hbox1
.Add( self
.time12
, 0, wx
.ALIGN_CENTRE 
) 
  45         hbox1
.Add( spin1
, 0, wx
.ALIGN_CENTRE 
) 
  46         grid
.Add( hbox1
, 0, wx
.LEFT 
) 
  48         grid
.Add( text2
, 0, wx
.ALIGN_RIGHT|wx
.TOP|wx
.BOTTOM 
) 
  49         hbox2 
= wx
.BoxSizer( wx
.HORIZONTAL 
) 
  50         hbox2
.Add( self
.time24
, 0, wx
.ALIGN_CENTRE 
) 
  51         hbox2
.Add( spin2
, 0, wx
.ALIGN_CENTRE 
) 
  52         grid
.Add( hbox2
, 0, wx
.LEFT 
) 
  54         grid
.Add( text3
, 0, wx
.ALIGN_RIGHT|wx
.TOP|wx
.BOTTOM 
) 
  55         grid
.Add( self
.spinless_ctrl
, 0, wx
.LEFT 
) 
  58         buttonChange 
= wx
.Button( self
, -1, "Change Controls") 
  59         self
.radio12to24 
= wx
.RadioButton( 
  60                             self
, -1, "Copy 12-hour time to 24-hour control", 
  61                             wx
.DefaultPosition
, wx
.DefaultSize
, wx
.RB_GROUP
 
  64         self
.radio24to12 
= wx
.RadioButton( 
  65                             self
, -1, "Copy 24-hour time to 12-hour control" 
  68         self
.radioWx 
= wx
.RadioButton( self
, -1, "Set controls to 'now' using wxDateTime") 
  69         self
.radioMx 
= wx
.RadioButton( self
, -1, "Set controls to 'now' using mxDateTime") 
  71         radio_vbox 
= wx
.BoxSizer( wx
.VERTICAL 
) 
  72         radio_vbox
.Add( self
.radio12to24
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.ALL
, 5 ) 
  73         radio_vbox
.Add( self
.radio24to12
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.ALL
, 5 ) 
  74         radio_vbox
.Add( self
.radioWx
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.ALL
, 5 ) 
  75         radio_vbox
.Add( self
.radioMx
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.ALL
, 5 ) 
  77         buttonbox
.Add( buttonChange
, 0, wx
.ALIGN_CENTRE|wx
.ALL
, 5 ) 
  78         buttonbox
.Add( radio_vbox
, 0, wx
.ALIGN_CENTRE|wx
.ALL
, 5 ) 
  80         hbox 
= wx
.BoxSizer( wx
.HORIZONTAL 
) 
  81         hbox
.Add( grid
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 15 ) 
  82         hbox
.Add( buttonbox
, 0, wx
.ALIGN_RIGHT|wx
.BOTTOM
, 20 ) 
  85         box_label 
= wx
.StaticBox( self
, -1, "Bounds Control" ) 
  86         boundsbox 
= wx
.StaticBoxSizer( box_label
, wx
.HORIZONTAL 
) 
  87         self
.set_bounds 
= wx
.CheckBox( self
, -1, "Set time bounds:" ) 
  89         minlabel 
= wx
.StaticText( self
, -1, "minimum time:" ) 
  90         self
.min = masked
.TimeCtrl( self
, -1, name
="min", display_seconds 
= False ) 
  91         self
.min.Enable( False ) 
  93         maxlabel 
= wx
.StaticText( self
, -1, "maximum time:" ) 
  94         self
.max = masked
.TimeCtrl( self
, -1, name
="max", display_seconds 
= False ) 
  95         self
.max.Enable( False ) 
  97         self
.limit_check 
= wx
.CheckBox( self
, -1, "Limit control" ) 
  99         label 
= wx
.StaticText( self
, -1, "Resulting time control:" ) 
 100         self
.target_ctrl 
= masked
.TimeCtrl( self
, -1, name
="new" ) 
 102         grid2 
= wx
.FlexGridSizer( 0, 2, 0, 0 ) 
 103         grid2
.Add( (20, 0), 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 104         grid2
.Add( (20, 0), 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 106         grid2
.Add( self
.set_bounds
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 107         grid3 
= wx
.FlexGridSizer( 0, 2, 5, 5 ) 
 108         grid3
.Add(minlabel
, 0, wx
.ALIGN_RIGHT|wx
.ALIGN_CENTER_VERTICAL 
) 
 109         grid3
.Add( self
.min, 0, wx
.ALIGN_LEFT 
) 
 110         grid3
.Add(maxlabel
, 0, wx
.ALIGN_RIGHT|wx
.ALIGN_CENTER_VERTICAL 
) 
 111         grid3
.Add( self
.max, 0, wx
.ALIGN_LEFT 
) 
 112         grid2
.Add(grid3
, 0, wx
.ALIGN_LEFT 
) 
 114         grid2
.Add( self
.limit_check
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 115         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( (20, 0), 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 119         grid2
.Add( label
, 0, wx
.ALIGN_LEFT|wx
.ALIGN_CENTER_VERTICAL|wx
.ALL
, 5 ) 
 120         grid2
.Add( self
.target_ctrl
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 121         boundsbox
.Add(grid2
, 0, wx
.ALIGN_CENTER|wx
.EXPAND|wx
.ALL
, 5) 
 123         vbox 
= wx
.BoxSizer( wx
.VERTICAL 
) 
 125         vbox
.Add( hbox
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5) 
 126         vbox
.Add( boundsbox
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5 ) 
 129         outer_box 
= wx
.BoxSizer( wx
.VERTICAL 
) 
 130         outer_box
.Add( vbox
, 0, wx
.ALIGN_LEFT|wx
.ALL
, 5) 
 133         # Turn on mxDateTime option only if we can import the module: 
 135             from mx 
import DateTime
 
 137             self
.radioMx
.Enable( False ) 
 140         self
.SetAutoLayout( True ) 
 141         self
.SetSizer( outer_box 
) 
 142         outer_box
.Fit( self 
) 
 143         self
.SetupScrolling() 
 145         self
.Bind(wx
.EVT_BUTTON
, self
.OnButtonClick
, buttonChange 
) 
 146         self
.Bind(masked
.EVT_TIMEUPDATE
, self
.OnTimeChange
, self
.time12 
) 
 147         self
.Bind(masked
.EVT_TIMEUPDATE
, self
.OnTimeChange
, self
.time24 
) 
 148         self
.Bind(masked
.EVT_TIMEUPDATE
, self
.OnTimeChange
, self
.spinless_ctrl 
) 
 149         self
.Bind(wx
.EVT_CHECKBOX
, self
.OnBoundsCheck
, self
.set_bounds 
) 
 150         self
.Bind(wx
.EVT_CHECKBOX
, self
.SetTargetMinMax
, self
.limit_check 
) 
 151         self
.Bind(masked
.EVT_TIMEUPDATE
, self
.SetTargetMinMax
, self
.min ) 
 152         self
.Bind(masked
.EVT_TIMEUPDATE
, self
.SetTargetMinMax
, self
.max ) 
 153         self
.Bind(masked
.EVT_TIMEUPDATE
, self
.OnTimeChange
, self
.target_ctrl 
) 
 156     def OnTimeChange( self
, event 
): 
 157         timectrl 
= self
.FindWindowById( event
.GetId() ) 
 158         ib_str 
= [ "  (out of bounds)", "" ] 
 160         self
.log
.write('%s time = %s%s\n' % ( timectrl
.GetName(), timectrl
.GetValue(), ib_str
[ timectrl
.IsInBounds() ] ) ) 
 163     def OnButtonClick( self
, event 
): 
 164         if self
.radio12to24
.GetValue(): 
 165             self
.time24
.SetValue( self
.time12
.GetValue() ) 
 167         elif self
.radio24to12
.GetValue(): 
 168             self
.time12
.SetValue( self
.time24
.GetValue() ) 
 170         elif self
.radioWx
.GetValue(): 
 171             now 
= wx
.DateTime_Now() 
 172             self
.time12
.SetValue( now 
) 
 173             # (demonstrates that G/SetValue returns/takes a wx.DateTime) 
 174             self
.time24
.SetValue( self
.time12
.GetValue(as_wxDateTime
=True) ) 
 176             # (demonstrates that G/SetValue returns/takes a wx.TimeSpan) 
 177             self
.spinless_ctrl
.SetValue( self
.time12
.GetValue(as_wxTimeSpan
=True) ) 
 179         elif self
.radioMx
.GetValue(): 
 180             from mx 
import DateTime
 
 182             self
.time12
.SetValue( now 
) 
 184             # (demonstrates that G/SetValue returns/takes a DateTime) 
 185             self
.time24
.SetValue( self
.time12
.GetValue(as_mxDateTime
=True) ) 
 187             # (demonstrates that G/SetValue returns/takes a DateTimeDelta) 
 188             self
.spinless_ctrl
.SetValue( self
.time12
.GetValue(as_mxDateTimeDelta
=True) ) 
 191     def OnBoundsCheck( self
, event 
): 
 192         self
.min.Enable( self
.set_bounds
.GetValue() ) 
 193         self
.max.Enable( self
.set_bounds
.GetValue() ) 
 194         self
.SetTargetMinMax() 
 197     def SetTargetMinMax( self
, event
=None ): 
 201         if self
.set_bounds
.GetValue(): 
 202             min = self
.min.GetWxDateTime() 
 203             max = self
.max.GetWxDateTime() 
 205             min, max = None, None 
 207         cur_min
, cur_max 
= self
.target_ctrl
.GetBounds() 
 209         if min and (min != cur_min
): self
.target_ctrl
.SetMin( min ) 
 210         if max and (max != cur_max
): self
.target_ctrl
.SetMax( max ) 
 212         self
.target_ctrl
.SetLimited( self
.limit_check
.GetValue() ) 
 214         if min != cur_min 
or max != cur_max
: 
 215             new_min
, new_max 
= self
.target_ctrl
.GetBounds() 
 217             if new_min 
and new_max
: 
 218                 self
.log
.write( "current min, max:  (%s, %s)\n" % ( new_min
.FormatTime(), new_max
.FormatTime() ) ) 
 220                 self
.log
.write( "current min, max:  (None, None)\n" ) 
 222 #---------------------------------------------------------------------- 
 224 def runTest( frame
, nb
, log 
): 
 225     win 
= TestPanel( nb
, log 
) 
 228 #---------------------------------------------------------------------- 
 229 import wx
.lib
.masked
.timectrl 
as timectl
 
 232 """ + timectl
.__doc
__ + """ 
 235 if __name__ 
== '__main__': 
 238     run
.main(['', os
.path
.basename(sys
.argv
[0])])