]>
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
.timectrl
as timectl
9 import wx
.lib
.scrolledpanel
as scrolled
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
= timectl
.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
= timectl
.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
= timectl
.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 = timectl
.TimeCtrl( self
, -1, name
="min", display_seconds
= False )
90 self
.min.Enable( False )
92 maxlabel
= wx
.StaticText( self
, -1, "maximum time:" )
93 self
.max = timectl
.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
= timectl
.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(timectl
.EVT_TIMEUPDATE
, self
.OnTimeChange
, self
.time12
)
146 self
.Bind(timectl
.EVT_TIMEUPDATE
, self
.OnTimeChange
, self
.time24
)
147 self
.Bind(timectl
.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(timectl
.EVT_TIMEUPDATE
, self
.SetTargetMinMax
, self
.min )
151 self
.Bind(timectl
.EVT_TIMEUPDATE
, self
.SetTargetMinMax
, self
.max )
152 self
.Bind(timectl
.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 #----------------------------------------------------------------------
229 overview
= timectl
.__doc
__
231 if __name__
== '__main__':
234 run
.main(['', os
.path
.basename(sys
.argv
[0])])