X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1e4a197e4c60e461b8068b0619692ea083e30b8b..0b9d8fe18e02e9d848d205c3f36812cd56fc1bcd:/wxPython/demo/wxTimeCtrl.py diff --git a/wxPython/demo/wxTimeCtrl.py b/wxPython/demo/wxTimeCtrl.py index 09465642dd..e6a5aeed2f 100644 --- a/wxPython/demo/wxTimeCtrl.py +++ b/wxPython/demo/wxTimeCtrl.py @@ -1,68 +1,114 @@ from wxPython.wx import * from wxPython.lib.timectrl import * +from wxPython.lib.timectrl import __doc__ as overviewdoc +from wxPython.lib.scrolledpanel import wxScrolledPanel #---------------------------------------------------------------------- -class TestPanel( wxPanel ): +class TestPanel( wxScrolledPanel ): def __init__( self, parent, log ): - wxPanel.__init__( self, parent, -1 ) + wxScrolledPanel.__init__( self, parent, -1 ) self.log = log - panel = wxPanel( self, -1 ) - grid = wxFlexGridSizer( 0, 2, 20, 0 ) - text1 = wxStaticText( panel, 10, "A 12-hour format wxTimeCtrl:") - self.time12 = wxTimeCtrl( panel, 20, name="12 hour control" ) - spin1 = wxSpinButton( panel, 30, wxDefaultPosition, wxSize(-1,20), 0 ) + text1 = wxStaticText( self, -1, "12-hour format:") + self.time12 = wxTimeCtrl( self, -1, name="12 hour control" ) + spin1 = wxSpinButton( self, -1, wxDefaultPosition, wxSize(-1,20), 0 ) self.time12.BindSpinButton( spin1 ) - grid.AddWindow( text1, 0, wxALIGN_RIGHT, 5 ) - hbox1 = wxBoxSizer( wxHORIZONTAL ) - hbox1.AddWindow( self.time12, 0, wxALIGN_CENTRE, 5 ) - hbox1.AddWindow( spin1, 0, wxALIGN_CENTRE, 5 ) - grid.AddSizer( hbox1, 0, wxLEFT, 5 ) + text2 = wxStaticText( self, -1, "24-hour format:") + spin2 = wxSpinButton( self, -1, wxDefaultPosition, wxSize(-1,20), 0 ) + self.time24 = wxTimeCtrl( self, -1, name="24 hour control", fmt24hr=True, spinButton = spin2 ) + text3 = wxStaticText( self, -1, "No seconds\nor spin button:") + self.spinless_ctrl = wxTimeCtrl( self, -1, name="spinless control", display_seconds = False ) - text2 = wxStaticText( panel, 40, "A 24-hour format wxTimeCtrl:") - self.time24 = wxTimeCtrl( panel, 50, fmt24hr=True, name="24 hour control" ) - spin2 = wxSpinButton( panel, 60, wxDefaultPosition, wxSize(-1,20), 0 ) - self.time24.BindSpinButton( spin2 ) + grid = wxFlexGridSizer( 0, 2, 10, 5 ) + grid.Add( text1, 0, wxALIGN_RIGHT ) + hbox1 = wxBoxSizer( wxHORIZONTAL ) + hbox1.Add( self.time12, 0, wxALIGN_CENTRE ) + hbox1.Add( spin1, 0, wxALIGN_CENTRE ) + grid.Add( hbox1, 0, wxLEFT ) - grid.AddWindow( text2, 0, wxALIGN_RIGHT|wxTOP|wxBOTTOM, 5 ) + grid.Add( text2, 0, wxALIGN_RIGHT|wxTOP|wxBOTTOM ) hbox2 = wxBoxSizer( wxHORIZONTAL ) - hbox2.AddWindow( self.time24, 0, wxALIGN_CENTRE, 5 ) - hbox2.AddWindow( spin2, 0, wxALIGN_CENTRE, 5 ) - grid.AddSizer( hbox2, 0, wxLEFT, 5 ) - + hbox2.Add( self.time24, 0, wxALIGN_CENTRE ) + hbox2.Add( spin2, 0, wxALIGN_CENTRE ) + grid.Add( hbox2, 0, wxLEFT ) - text3 = wxStaticText( panel, 70, "A wxTimeCtrl without a spin button:") - self.spinless_ctrl = wxTimeCtrl( panel, 80, name="spinless control" ) + grid.Add( text3, 0, wxALIGN_RIGHT|wxTOP|wxBOTTOM ) + grid.Add( self.spinless_ctrl, 0, wxLEFT ) - grid.AddWindow( text3, 0, wxALIGN_RIGHT|wxTOP|wxBOTTOM, 5 ) - grid.AddWindow( self.spinless_ctrl, 0, wxLEFT, 5 ) - - buttonChange = wxButton( panel, 100, "Change Controls") - self.radio12to24 = wxRadioButton( panel, 110, "Copy 12-hour time to 24-hour control", wxDefaultPosition, wxDefaultSize, wxRB_GROUP ) - self.radio24to12 = wxRadioButton( panel, 120, "Copy 24-hour time to 12-hour control") - self.radioWx = wxRadioButton( panel, 130, "Set controls to 'now' using wxDateTime") - self.radioMx = wxRadioButton( panel, 140, "Set controls to 'now' using mxDateTime") + buttonChange = wxButton( self, -1, "Change Controls") + self.radio12to24 = wxRadioButton( self, -1, "Copy 12-hour time to 24-hour control", wxDefaultPosition, wxDefaultSize, wxRB_GROUP ) + self.radio24to12 = wxRadioButton( self, -1, "Copy 24-hour time to 12-hour control") + self.radioWx = wxRadioButton( self, -1, "Set controls to 'now' using wxDateTime") + self.radioMx = wxRadioButton( self, -1, "Set controls to 'now' using mxDateTime") radio_vbox = wxBoxSizer( wxVERTICAL ) - radio_vbox.AddWindow( self.radio12to24, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ) - radio_vbox.AddWindow( self.radio24to12, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ) - radio_vbox.AddWindow( self.radioWx, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ) - radio_vbox.AddWindow( self.radioMx, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ) + radio_vbox.Add( self.radio12to24, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ) + radio_vbox.Add( self.radio24to12, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ) + radio_vbox.Add( self.radioWx, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ) + radio_vbox.Add( self.radioMx, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ) - box_label = wxStaticBox( panel, 90, "Change Controls through API" ) + box_label = wxStaticBox( self, -1, "Change Controls through API" ) buttonbox = wxStaticBoxSizer( box_label, wxHORIZONTAL ) - buttonbox.AddWindow( buttonChange, 0, wxALIGN_CENTRE|wxALL, 5 ) - buttonbox.AddSizer( radio_vbox, 0, wxALIGN_CENTRE|wxALL, 5 ) + buttonbox.Add( buttonChange, 0, wxALIGN_CENTRE|wxALL, 5 ) + buttonbox.Add( radio_vbox, 0, wxALIGN_CENTRE|wxALL, 5 ) + + hbox = wxBoxSizer( wxHORIZONTAL ) + hbox.Add( grid, 0, wxALIGN_LEFT|wxALL, 15 ) + hbox.Add( buttonbox, 0, wxALIGN_RIGHT|wxBOTTOM, 20 ) + + + box_label = wxStaticBox( self, -1, "Bounds Control" ) + boundsbox = wxStaticBoxSizer( box_label, wxHORIZONTAL ) + self.set_bounds = wxCheckBox( self, -1, "Set time bounds:" ) + + minlabel = wxStaticText( self, -1, "minimum time:" ) + self.min = wxTimeCtrl( self, -1, name="min", display_seconds = False ) + self.min.Enable( False ) + + maxlabel = wxStaticText( self, -1, "maximum time:" ) + self.max = wxTimeCtrl( self, -1, name="max", display_seconds = False ) + self.max.Enable( False ) + + self.limit_check = wxCheckBox( self, -1, "Limit control" ) + + label = wxStaticText( self, -1, "Resulting time control:" ) + self.target_ctrl = wxTimeCtrl( self, -1, name="new" ) + + grid2 = wxFlexGridSizer( 0, 2, 0, 0 ) + grid2.Add( 20, 0, 0, wxALIGN_LEFT|wxALL, 5 ) + grid2.Add( 20, 0, 0, wxALIGN_LEFT|wxALL, 5 ) + + grid2.Add( self.set_bounds, 0, wxALIGN_LEFT|wxALL, 5 ) + grid3 = wxFlexGridSizer( 0, 2, 5, 5 ) + grid3.Add(minlabel, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL ) + grid3.Add( self.min, 0, wxALIGN_LEFT ) + grid3.Add(maxlabel, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL ) + grid3.Add( self.max, 0, wxALIGN_LEFT ) + grid2.Add(grid3, 0, wxALIGN_LEFT ) + + grid2.Add( self.limit_check, 0, wxALIGN_LEFT|wxALL, 5 ) + grid2.Add( 20, 0, 0, wxALIGN_LEFT|wxALL, 5 ) + + grid2.Add( 20, 0, 0, wxALIGN_LEFT|wxALL, 5 ) + grid2.Add( 20, 0, 0, wxALIGN_LEFT|wxALL, 5 ) + grid2.Add( label, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxALL, 5 ) + grid2.Add( self.target_ctrl, 0, wxALIGN_LEFT|wxALL, 5 ) + boundsbox.Add(grid2, 0, wxALIGN_CENTER|wxEXPAND|wxALL, 5) + + vbox = wxBoxSizer( wxVERTICAL ) + vbox.AddSpacer(20, 20) + vbox.Add( hbox, 0, wxALIGN_LEFT|wxALL, 5) + vbox.Add( boundsbox, 0, wxALIGN_LEFT|wxALL, 5 ) + outer_box = wxBoxSizer( wxVERTICAL ) - outer_box.AddSizer( grid, 0, wxALIGN_CENTRE|wxBOTTOM, 20 ) - outer_box.AddSizer( buttonbox, 0, wxALIGN_CENTRE|wxALL, 5 ) + outer_box.Add( vbox, 0, wxALIGN_LEFT|wxALL, 5) # Turn on mxDateTime option only if we can import the module: @@ -72,23 +118,31 @@ class TestPanel( wxPanel ): self.radioMx.Enable( False ) - panel.SetAutoLayout( True ) - panel.SetSizer( outer_box ) - outer_box.Fit( panel ) - panel.Move( (50,50) ) - self.panel = panel - + self.SetAutoLayout( True ) + self.SetSizer( outer_box ) + outer_box.Fit( self ) + self.SetupScrolling() + EVT_BUTTON( self, buttonChange.GetId(), self.OnButtonClick ) EVT_TIMEUPDATE( self, self.time12.GetId(), self.OnTimeChange ) EVT_TIMEUPDATE( self, self.time24.GetId(), self.OnTimeChange ) EVT_TIMEUPDATE( self, self.spinless_ctrl.GetId(), self.OnTimeChange ) - EVT_BUTTON( self, buttonChange.GetId(), self.OnButtonClick ) + + EVT_CHECKBOX( self, self.set_bounds.GetId(), self.OnBoundsCheck ) + EVT_CHECKBOX( self, self.limit_check.GetId(), self.SetTargetMinMax ) + EVT_TIMEUPDATE( self, self.min.GetId(), self.SetTargetMinMax ) + EVT_TIMEUPDATE( self, self.max.GetId(), self.SetTargetMinMax ) + EVT_TIMEUPDATE( self, self.target_ctrl.GetId(), self.OnTimeChange ) + def OnTimeChange( self, event ): - timectrl = self.panel.FindWindowById( event.GetId() ) - self.log.write('%s time = %s\n' % ( timectrl.GetName(), timectrl.GetValue() ) ) + timectrl = self.FindWindowById( event.GetId() ) + ib_str = [ " (out of bounds)", "" ] + + self.log.write('%s time = %s%s\n' % ( timectrl.GetName(), timectrl.GetValue(), ib_str[ timectrl.IsInBounds() ] ) ) + def OnButtonClick( self, event ): if self.radio12to24.GetValue(): @@ -99,16 +153,53 @@ class TestPanel( wxPanel ): elif self.radioWx.GetValue(): now = wxDateTime_Now() - self.time12.SetWxDateTime( now ) - self.time24.SetWxDateTime( now ) - self.spinless_ctrl.SetWxDateTime( now ) + self.time12.SetValue( now ) + # (demonstrates that G/SetValue returns/takes a wxDateTime) + self.time24.SetValue( self.time12.GetValue(as_wxDateTime=True) ) + + # (demonstrates that G/SetValue returns/takes a wxTimeSpan) + self.spinless_ctrl.SetValue( self.time12.GetValue(as_wxTimeSpan=True) ) elif self.radioMx.GetValue(): from mx import DateTime now = DateTime.now() - self.time12.SetMxDateTime( now ) - self.time24.SetMxDateTime( now ) - self.spinless_ctrl.SetMxDateTime( now ) + self.time12.SetValue( now ) + + # (demonstrates that G/SetValue returns/takes a DateTime) + self.time24.SetValue( self.time12.GetValue(as_mxDateTime=True) ) + + # (demonstrates that G/SetValue returns/takes a DateTimeDelta) + self.spinless_ctrl.SetValue( self.time12.GetValue(as_mxDateTimeDelta=True) ) + + + def OnBoundsCheck( self, event ): + self.min.Enable( self.set_bounds.GetValue() ) + self.max.Enable( self.set_bounds.GetValue() ) + self.SetTargetMinMax() + + + def SetTargetMinMax( self, event=None ): + min = max = None + + if self.set_bounds.GetValue(): + min = self.min.GetWxDateTime() + max = self.max.GetWxDateTime() + else: + min, max = None, None + + cur_min, cur_max = self.target_ctrl.GetBounds() + + if min != cur_min: self.target_ctrl.SetMin( min ) + if max != cur_max: self.target_ctrl.SetMax( max ) + + self.target_ctrl.SetLimited( self.limit_check.GetValue() ) + + if min != cur_min or max != cur_max: + new_min, new_max = self.target_ctrl.GetBounds() + if new_min and new_max: + self.log.write( "current min, max: (%s, %s)\n" % ( new_min.FormatTime(), new_max.FormatTime() ) ) + else: + self.log.write( "current min, max: (None, None)\n" ) #---------------------------------------------------------------------- @@ -118,93 +209,7 @@ def runTest( frame, nb, log ): #---------------------------------------------------------------------- -overview = """ -

-wxTimeCtrl provides a multi-cell control that allows manipulation of a time -value. It supports 12 or 24 hour format, and you can use wxDateTime or mxDateTime -to get/set values from the control. -

-Left/right/tab keys to switch cells within a wxTimeCtrl, and the up/down arrows act -like a spin control. wxTimeCtrl also allows for an actual spin button to be attached -to the control, so that it acts like the up/down arrow keys. -

-The ! or c key sets the value of the control to now. -

-Here's the API for wxTimeCtrl: -

-    wxTimeCtrl(
-         parent, id = -1,
-         value = '12:00:00 AM',
-         pos = wxDefaultPosition,
-         size = wxDefaultSize,
-         fmt24hr = False,
-         spinButton = None,
-         style = wxTE_PROCESS_TAB,
-         name = "time")
-
- -
-
-
SetValue(time_string) -
Sets the value of the control to a particular time, given a valid time string; -raises ValueError on invalid value -
-
GetValue() -
Retrieves the string value of the time from the control -
-
SetWxDateTime(wxDateTime) -
Uses the time portion of a wxDateTime to construct a value for the control. -
-
GetWxDateTime() -
Retrieves the value of the control, and applies it to the wxDateTimeFromHMS() -constructor, and returns the resulting value. (This returns the date portion as -"today".) -
-
SetMxDateTime(mxDateTime) -
Uses the time portion of an mxDateTime to construct a value for the control. -NOTE: This imports mx.DateTime at runtime only if this or the Get function -is called. -
-
GetMxDateTime() -
Retrieves the value of the control and applies it to the DateTime.Time() -constructor, and returns the resulting value. (mxDateTime is smart enough to -know this is just a time value.) -
-
BindSpinButton(wxSpinBtton) -
Binds an externally created spin button to the control, so that up/down spin -events change the active cell or selection in the control (in addition to the -up/down cursor keys.) (This is primarily to allow you to create a "standard" -interface to time controls, as seen in Windows.) -
-
EVT_TIMEUPDATE(win, id, func) -
func is fired whenever the value of the control changes. -
- -""" - - +overview = overviewdoc if __name__ == '__main__': import sys,os