-from wxPython.wx import *
-from wxPython.lib.maskededit import Field, wxMaskedTextCtrl, wxMaskedComboBox, wxIpAddrCtrl, states, months
-from wxPython.lib.maskededit import __doc__ as overviewdoc
-from wxPython.lib.maskededit import autoformats
-from wxPython.lib.scrolledpanel import wxScrolledPanel
-import string, sys, traceback
+
+import string
+import sys
+import traceback
+
+import wx
+import wx.lib.maskededit as med
+import wx.lib.maskedctrl as mctl
+import wx.lib.scrolledpanel as scroll
+
class demoMixin:
"""
Centralized routines common to demo pages, to remove repetition.
"""
def labelGeneralTable(self, sizer):
- description = wxStaticText( self, -1, "Description", )
- mask = wxStaticText( self, -1, "Mask Value" )
- formatcode = wxStaticText( self, -1, "Format" )
- regex = wxStaticText( self, -1, "Regexp Validator(opt.)" )
- ctrl = wxStaticText( self, -1, "wxMaskedEdit Ctrl" )
-
- description.SetFont( wxFont(9, wxSWISS, wxNORMAL, wxBOLD))
- mask.SetFont( wxFont(9, wxSWISS, wxNORMAL, wxBOLD))
- formatcode.SetFont( wxFont(9, wxSWISS, wxNORMAL, wxBOLD) )
- regex.SetFont( wxFont(9, wxSWISS, wxNORMAL, wxBOLD))
- ctrl.SetFont( wxFont(9, wxSWISS, wxNORMAL, wxBOLD))
+ description = wx.StaticText( self, -1, "Description", )
+ mask = wx.StaticText( self, -1, "Mask Value" )
+ formatcode = wx.StaticText( self, -1, "Format" )
+ regex = wx.StaticText( self, -1, "Regexp Validator(opt.)" )
+ ctrl = wx.StaticText( self, -1, "MaskedTextCtrl" )
+
+ description.SetFont( wx.Font(9, wx.SWISS, wx.NORMAL, wx.BOLD))
+ mask.SetFont( wx.Font(9, wx.SWISS, wx.NORMAL, wx.BOLD))
+ formatcode.SetFont( wx.Font(9, wx.SWISS, wx.NORMAL, wx.BOLD) )
+ regex.SetFont( wx.Font(9, wx.SWISS, wx.NORMAL, wx.BOLD))
+ ctrl.SetFont( wx.Font(9, wx.SWISS, wx.NORMAL, wx.BOLD))
sizer.Add(description)
sizer.Add(mask)
def layoutGeneralTable(self, controls, sizer):
for control in controls:
- sizer.Add( wxStaticText( self, -1, control[0]) )
- sizer.Add( wxStaticText( self, -1, control[1]) )
- sizer.Add( wxStaticText( self, -1, control[3]) )
- sizer.Add( wxStaticText( self, -1, control[4]) )
+ sizer.Add( wx.StaticText( self, -1, control[0]) )
+ sizer.Add( wx.StaticText( self, -1, control[1]) )
+ sizer.Add( wx.StaticText( self, -1, control[3]) )
+ sizer.Add( wx.StaticText( self, -1, control[4]) )
if control in controls:
- newControl = wxMaskedTextCtrl( self, -1, "",
+ newControl = med.MaskedTextCtrl( self, -1, "",
mask = control[1],
excludeChars = control[2],
formatcodes = control[3],
def changeControlParams(self, event, parameter, checked_value, notchecked_value):
- if event.Checked(): value = checked_value
+ if event.IsChecked(): value = checked_value
else: value = notchecked_value
+
kwargs = {parameter: value}
+
for control in self.editList:
control.SetCtrlParameters(**kwargs)
control.Refresh()
+
self.Refresh()
#----------------------------------------------------------------------------
-class demoPage1(wxScrolledPanel, demoMixin):
+class demoPage1(scroll.ScrolledPanel, demoMixin):
def __init__(self, parent, log):
- wxScrolledPanel.__init__(self, parent, -1)
- self.sizer = wxBoxSizer( wxVERTICAL )
+ scroll.ScrolledPanel.__init__(self, parent, -1)
+ self.sizer = wx.BoxSizer( wx.VERTICAL )
self.editList = []
- label = wxStaticText( self, -1, """\
-Here are some basic wxMaskedTextCtrls to give you an idea of what you can do
+ label = wx.StaticText( self, -1, """\
+Here are some basic MaskedTextCtrls to give you an idea of what you can do
with this control. Note that all controls have been auto-sized by including 'F' in
the format codes.
Smith, Jones, Williams). Signs on numbers can be toggled with the minus key.
""")
label.SetForegroundColour( "Blue" )
- header = wxBoxSizer( wxHORIZONTAL )
- header.Add( label, 0, flag=wxALIGN_LEFT|wxALL, border = 5 )
+ header = wx.BoxSizer( wx.HORIZONTAL )
+ header.Add( label, 0, flag=wx.ALIGN_LEFT|wx.ALL, border = 5 )
- highlight = wxCheckBox( self, -1, "Highlight Empty" )
- disallow = wxCheckBox( self, -1, "Disallow Empty" )
- showFill = wxCheckBox( self, -1, "change fillChar" )
+ highlight = wx.CheckBox( self, -1, "Highlight Empty" )
+ disallow = wx.CheckBox( self, -1, "Disallow Empty" )
+ showFill = wx.CheckBox( self, -1, "change fillChar" )
- vbox = wxBoxSizer( wxVERTICAL )
- vbox.Add( highlight, 0, wxALIGN_LEFT|wxALL, 5 )
- vbox.Add( disallow, 0, wxALIGN_LEFT|wxALL, 5 )
- vbox.Add( showFill, 0, wxALIGN_LEFT|wxALL, 5 )
- header.AddSpacer(15, 0)
- header.Add(vbox, 0, flag=wxALIGN_LEFT|wxALL, border=5 )
+ vbox = wx.BoxSizer( wx.VERTICAL )
+ vbox.Add( highlight, 0, wx.ALIGN_LEFT|wx.ALL, 5 )
+ vbox.Add( disallow, 0, wx.ALIGN_LEFT|wx.ALL, 5 )
+ vbox.Add( showFill, 0, wx.ALIGN_LEFT|wx.ALL, 5 )
+ header.Add((15, 0))
+ header.Add(vbox, 0, flag=wx.ALIGN_LEFT|wx.ALL, border=5 )
- EVT_CHECKBOX( self, highlight.GetId(), self.onHighlightEmpty )
- EVT_CHECKBOX( self, disallow.GetId(), self.onDisallowEmpty )
- EVT_CHECKBOX( self, showFill.GetId(), self.onShowFill )
+ self.Bind(wx.EVT_CHECKBOX, self.onHighlightEmpty, id=highlight.GetId())
+ self.Bind(wx.EVT_CHECKBOX, self.onDisallowEmpty, id=disallow.GetId())
+ self.Bind(wx.EVT_CHECKBOX, self.onShowFill, id=showFill.GetId())
- grid = wxFlexGridSizer( 0, 5, vgap=10, hgap=10 )
+ grid = wx.FlexGridSizer( 0, 5, vgap=10, hgap=10 )
self.labelGeneralTable(grid)
# The following list is of the controls for the demo. Feel free to play around with
]
self.layoutGeneralTable(controls, grid)
- self.sizer.Add( header, 0, flag=wxALIGN_LEFT|wxALL, border=5 )
- self.sizer.Add( grid, 0, flag= wxALIGN_LEFT|wxLEFT, border=5 )
+ self.sizer.Add( header, 0, flag=wx.ALIGN_LEFT|wx.ALL, border=5 )
+ self.sizer.Add( grid, 0, flag= wx.ALIGN_LEFT|wx.LEFT, border=5 )
self.SetSizer(self.sizer)
self.SetupScrolling()
self.SetAutoLayout(1)
def onHighlightEmpty( self, event ):
""" Highlight empty values"""
- self.changeControlParams( event, "emptyBackgroundColor", "Blue", "White" )
+ self.changeControlParams( event, "emptyBackgroundColour", "Blue", "White" )
def onShowFill( self, event ):
""" Set fillChar parameter to '?' or ' ' """
self.changeControlParams( event, "fillChar", '?', ' ' )
-class demoPage2(wxScrolledPanel, demoMixin):
+class demoPage2(scroll.ScrolledPanel, demoMixin):
def __init__( self, parent, log ):
self.log = log
- wxScrolledPanel.__init__( self, parent, -1 )
- self.sizer = wxBoxSizer( wxVERTICAL )
+ scroll.ScrolledPanel.__init__( self, parent, -1 )
+ self.sizer = wx.BoxSizer( wx.VERTICAL )
- label = wxStaticText( self, -1, """\
-All these controls have been created by passing a single parameter, the autoformat code.
-The class contains an internal dictionary of types and formats (autoformats).
+ label = wx.StaticText( self, -1, """\
+All these controls have been created by passing a single parameter, the autoformat code,
+and use the factory class MaskedCtrl with its default controlType.
+The maskededit module contains an internal dictionary of types and formats (autoformats).
Many of these already do complicated validation; To see some examples, try
29 Feb 2002 vs. 2004 for the date formats, or email address validation.
""")
label.SetForegroundColour( "Blue" )
- self.sizer.Add( label, 0, wxALIGN_LEFT|wxALL, 5 )
-
- description = wxStaticText( self, -1, "Description")
- autofmt = wxStaticText( self, -1, "AutoFormat Code")
- ctrl = wxStaticText( self, -1, "wxMaskedEdit Control")
-
- description.SetFont( wxFont( 9, wxSWISS, wxNORMAL, wxBOLD ) )
- autofmt.SetFont( wxFont( 9, wxSWISS, wxNORMAL, wxBOLD ) )
- ctrl.SetFont( wxFont( 9, wxSWISS, wxNORMAL, wxBOLD ) )
-
- grid = wxFlexGridSizer( 0, 3, vgap=10, hgap=5 )
- grid.Add( description, 0, wxALIGN_LEFT )
- grid.Add( autofmt, 0, wxALIGN_LEFT )
- grid.Add( ctrl, 0, wxALIGN_LEFT )
-
- for autoformat, desc in autoformats:
- grid.Add( wxStaticText( self, -1, desc), 0, wxALIGN_LEFT )
- grid.Add( wxStaticText( self, -1, autoformat), 0, wxALIGN_LEFT )
- grid.Add( wxMaskedTextCtrl( self, -1, "",
- autoformat = autoformat,
- demo = True,
- name = autoformat),
- 0, wxALIGN_LEFT )
-
- self.sizer.Add( grid, 0, wxALIGN_LEFT|wxALL, border=5 )
+ self.sizer.Add( label, 0, wx.ALIGN_LEFT|wx.ALL, 5 )
+
+ description = wx.StaticText( self, -1, "Description")
+ autofmt = wx.StaticText( self, -1, "AutoFormat Code")
+ ctrl = wx.StaticText( self, -1, "MaskedCtrl")
+
+ description.SetFont( wx.Font( 9, wx.SWISS, wx.NORMAL, wx.BOLD ) )
+ autofmt.SetFont( wx.Font( 9, wx.SWISS, wx.NORMAL, wx.BOLD ) )
+ ctrl.SetFont( wx.Font( 9, wx.SWISS, wx.NORMAL, wx.BOLD ) )
+
+ grid = wx.FlexGridSizer( 0, 3, vgap=10, hgap=5 )
+ grid.Add( description, 0, wx.ALIGN_LEFT )
+ grid.Add( autofmt, 0, wx.ALIGN_LEFT )
+ grid.Add( ctrl, 0, wx.ALIGN_LEFT )
+
+ for autoformat, desc in med.autoformats:
+ grid.Add( wx.StaticText( self, -1, desc), 0, wx.ALIGN_LEFT )
+ grid.Add( wx.StaticText( self, -1, autoformat), 0, wx.ALIGN_LEFT )
+ grid.Add( mctl.MaskedCtrl( self, -1, "",
+ autoformat = autoformat,
+ demo = True,
+ name = autoformat),
+ 0, wx.ALIGN_LEFT )
+
+ self.sizer.Add( grid, 0, wx.ALIGN_LEFT|wx.ALL, border=5 )
self.SetSizer( self.sizer )
self.SetAutoLayout( 1 )
self.SetupScrolling()
-class demoPage3(wxScrolledPanel, demoMixin):
+class demoPage3(scroll.ScrolledPanel, demoMixin):
def __init__(self, parent, log):
self.log = log
- wxScrolledPanel.__init__(self, parent, -1)
- self.sizer = wxBoxSizer( wxVERTICAL )
+ scroll.ScrolledPanel.__init__(self, parent, -1)
+ self.sizer = wx.BoxSizer( wx.VERTICAL )
self.editList = []
- label = wxStaticText( self, -1, """\
-Here wxMaskedTextCtrls that have default values. The states
+ label = wx.StaticText( self, -1, """\
+Here MaskedTextCtrls that have default values. The states
control has a list of valid values, and the unsigned integer
has a legal range specified.
""")
label.SetForegroundColour( "Blue" )
- requireValid = wxCheckBox( self, -1, "Require Valid Value" )
- EVT_CHECKBOX( self, requireValid.GetId(), self.onRequireValid )
+ requireValid = wx.CheckBox( self, -1, "Require Valid Value" )
+ self.Bind(wx.EVT_CHECKBOX, self.onRequireValid, id=requireValid.GetId())
- header = wxBoxSizer( wxHORIZONTAL )
- header.Add( label, 0, flag=wxALIGN_LEFT|wxALL, border = 5)
- header.AddSpacer(75, 0)
- header.Add( requireValid, 0, flag=wxALIGN_LEFT|wxALL, border=10 )
+ header = wx.BoxSizer( wx.HORIZONTAL )
+ header.Add( label, 0, flag=wx.ALIGN_LEFT|wx.ALL, border = 5)
+ header.Add((75, 0))
+ header.Add( requireValid, 0, flag=wx.ALIGN_LEFT|wx.ALL, border=10 )
- grid = wxFlexGridSizer( 0, 5, vgap=10, hgap=10 )
+ grid = wx.FlexGridSizer( 0, 5, vgap=10, hgap=10 )
self.labelGeneralTable( grid )
controls = [
#description mask excl format regexp range,list,initial
- ("U.S. State (2 char)", "AA", "", 'F!_', "[A-Z]{2}", '',states, states[0]),
- ("Integer (signed)", "#{6}", "", 'F-_R', "", '','', '0 '),
+ ("U.S. State (2 char)", "AA", "", 'F!_', "[A-Z]{2}", '',med.states, med.states[0]),
+ ("Integer (signed)", "#{6}", "", 'F-_', "", '','', ' 0 '),
("Integer (unsigned)\n(1-399)","######", "", 'F_', "", (1,399),'', '1 '),
("Float (signed)", "#{6}.#{9}", "", 'F-_R', "", '','', '000000.000000000'),
- ("Date (MDY) + Time", "##/##/#### ##:##:## AM", 'BCDEFGHIJKLMNOQRSTUVWXYZ','DF!',"", '','', wxDateTime_Now().Format("%m/%d/%Y %I:%M:%S %p")),
+ ("Date (MDY) + Time", "##/##/#### ##:##:## AM", 'BCDEFGHIJKLMNOQRSTUVWXYZ','DF!',"", '','', wx.DateTime_Now().Format("%m/%d/%Y %I:%M:%S %p")),
]
self.layoutGeneralTable( controls, grid )
- self.sizer.Add( header, 0, flag=wxALIGN_LEFT|wxALL, border=5 )
- self.sizer.Add( grid, 0, flag=wxALIGN_LEFT|wxALL, border=5 )
+ self.sizer.Add( header, 0, flag=wx.ALIGN_LEFT|wx.ALL, border=5 )
+ self.sizer.Add( grid, 0, flag=wx.ALIGN_LEFT|wx.ALL, border=5 )
self.SetSizer( self.sizer )
self.SetAutoLayout( 1 )
self.changeControlParams( event, "validRequired", True, False )
-class demoPage4(wxScrolledPanel, demoMixin):
+class demoPage4(scroll.ScrolledPanel, demoMixin):
def __init__( self, parent, log ):
self.log = log
- wxScrolledPanel.__init__( self, parent, -1 )
- self.sizer = wxBoxSizer( wxVERTICAL )
+ scroll.ScrolledPanel.__init__( self, parent, -1 )
+ self.sizer = wx.BoxSizer( wx.VERTICAL )
- label = wxStaticText( self, -1, """\
+ label = wx.StaticText( self, -1, """\
These controls have field-specific choice lists and allow autocompletion.
Down arrow or Page Down in an uncompleted field with an auto-completable field will attempt
""")
label.SetForegroundColour( "Blue" )
- self.sizer.Add( label, 0, wxALIGN_LEFT|wxALL, 5 )
+ self.sizer.Add( label, 0, wx.ALIGN_LEFT|wx.ALL, 5 )
- description = wxStaticText( self, -1, "Description" )
- autofmt = wxStaticText( self, -1, "AutoFormat Code" )
- fields = wxStaticText( self, -1, "Field Objects" )
- ctrl = wxStaticText( self, -1, "wxMaskedEdit Control" )
+ description = wx.StaticText( self, -1, "Description" )
+ autofmt = wx.StaticText( self, -1, "AutoFormat Code" )
+ fields = wx.StaticText( self, -1, "Field Objects" )
+ ctrl = wx.StaticText( self, -1, "MaskedTextCtrl" )
- description.SetFont( wxFont( 9, wxSWISS, wxNORMAL, wxBOLD ) )
- autofmt.SetFont( wxFont( 9, wxSWISS, wxNORMAL, wxBOLD ) )
- fields.SetFont( wxFont( 9, wxSWISS, wxNORMAL, wxBOLD ) )
- ctrl.SetFont( wxFont( 9, wxSWISS, wxNORMAL, wxBOLD ) )
+ description.SetFont( wx.Font( 9, wx.SWISS, wx.NORMAL, wx.BOLD ) )
+ autofmt.SetFont( wx.Font( 9, wx.SWISS, wx.NORMAL, wx.BOLD ) )
+ fields.SetFont( wx.Font( 9, wx.SWISS, wx.NORMAL, wx.BOLD ) )
+ ctrl.SetFont( wx.Font( 9, wx.SWISS, wx.NORMAL, wx.BOLD ) )
- grid = wxFlexGridSizer( 0, 4, vgap=10, hgap=10 )
- grid.Add( description, 0, wxALIGN_LEFT )
- grid.Add( autofmt, 0, wxALIGN_LEFT )
- grid.Add( fields, 0, wxALIGN_LEFT )
- grid.Add( ctrl, 0, wxALIGN_LEFT )
+ grid = wx.FlexGridSizer( 0, 4, vgap=10, hgap=10 )
+ grid.Add( description, 0, wx.ALIGN_LEFT )
+ grid.Add( autofmt, 0, wx.ALIGN_LEFT )
+ grid.Add( fields, 0, wx.ALIGN_LEFT )
+ grid.Add( ctrl, 0, wx.ALIGN_LEFT )
autoformat = "USPHONEFULLEXT"
- fieldsDict = {0: Field(choices=["617","781","508","978","413"], choiceRequired=True)}
+ fieldsDict = {0: med.Field(choices=["617","781","508","978","413"], choiceRequired=True)}
fieldsLabel = """\
{0: Field(choices=[
"617","781",
"508","978","413"],
choiceRequired=True)}"""
- grid.Add( wxStaticText( self, -1, "Restricted Area Code"), 0, wxALIGN_LEFT )
- grid.Add( wxStaticText( self, -1, autoformat), 0, wxALIGN_LEFT )
- grid.Add( wxStaticText( self, -1, fieldsLabel), 0, wxALIGN_LEFT )
- grid.Add( wxMaskedTextCtrl( self, -1, "",
+ grid.Add( wx.StaticText( self, -1, "Restricted Area Code"), 0, wx.ALIGN_LEFT )
+ grid.Add( wx.StaticText( self, -1, autoformat), 0, wx.ALIGN_LEFT )
+ grid.Add( wx.StaticText( self, -1, fieldsLabel), 0, wx.ALIGN_LEFT )
+ grid.Add( med.MaskedTextCtrl( self, -1, "",
autoformat = autoformat,
fields = fieldsDict,
demo = True,
name = autoformat),
- 0, wxALIGN_LEFT )
+ 0, wx.ALIGN_LEFT )
autoformat = "EXPDATEMMYY"
- fieldsDict = {1: Field(choices=["03", "04", "05"], choiceRequired=True)}
+ fieldsDict = {1: med.Field(choices=["03", "04", "05"], choiceRequired=True)}
fieldsLabel = """\
{1: Field(choices=[
"03", "04", "05"],
choiceRequired=True)}"""
- exp = wxMaskedTextCtrl( self, -1, "",
+ exp = med.MaskedTextCtrl( self, -1, "",
autoformat = autoformat,
fields = fieldsDict,
demo = True,
name = autoformat)
- grid.Add( wxStaticText( self, -1, "Restricted Expiration"), 0, wxALIGN_LEFT )
- grid.Add( wxStaticText( self, -1, autoformat), 0, wxALIGN_LEFT )
- grid.Add( wxStaticText( self, -1, fieldsLabel), 0, wxALIGN_LEFT )
- grid.Add( exp, 0, wxALIGN_LEFT )
+ grid.Add( wx.StaticText( self, -1, "Restricted Expiration"), 0, wx.ALIGN_LEFT )
+ grid.Add( wx.StaticText( self, -1, autoformat), 0, wx.ALIGN_LEFT )
+ grid.Add( wx.StaticText( self, -1, fieldsLabel), 0, wx.ALIGN_LEFT )
+ grid.Add( exp, 0, wx.ALIGN_LEFT )
- fieldsDict = {0: Field(choices=["02134","02155"], choiceRequired=True),
- 1: Field(choices=["1234", "5678"], choiceRequired=False)}
+ fieldsDict = {0: med.Field(choices=["02134","02155"], choiceRequired=True),
+ 1: med.Field(choices=["1234", "5678"], choiceRequired=False)}
fieldsLabel = """\
{0: Field(choices=["02134","02155"],
choiceRequired=True),
1: Field(choices=["1234", "5678"],
choiceRequired=False)}"""
autoformat = "USZIPPLUS4"
- zip = wxMaskedTextCtrl( self, -1, "",
+ zip = med.MaskedTextCtrl( self, -1, "",
autoformat = autoformat,
fields = fieldsDict,
demo = True,
name = autoformat)
- grid.Add( wxStaticText( self, -1, "Restricted Zip + 4"), 0, wxALIGN_LEFT )
- grid.Add( wxStaticText( self, -1, autoformat), 0, wxALIGN_LEFT )
- grid.Add( wxStaticText( self, -1, fieldsLabel), 0, wxALIGN_LEFT )
- grid.Add( zip, 0, wxALIGN_LEFT )
+ grid.Add( wx.StaticText( self, -1, "Restricted Zip + 4"), 0, wx.ALIGN_LEFT )
+ grid.Add( wx.StaticText( self, -1, autoformat), 0, wx.ALIGN_LEFT )
+ grid.Add( wx.StaticText( self, -1, fieldsLabel), 0, wx.ALIGN_LEFT )
+ grid.Add( zip, 0, wx.ALIGN_LEFT )
- self.sizer.Add( grid, 0, wxALIGN_LEFT|wxALL, border=5 )
+ self.sizer.Add( grid, 0, wx.ALIGN_LEFT|wx.ALL, border=5 )
self.SetSizer( self.sizer )
self.SetAutoLayout(1)
self.SetupScrolling()
-class demoPage5(wxScrolledPanel, demoMixin):
+class demoPage5(scroll.ScrolledPanel, demoMixin):
def __init__( self, parent, log ):
self.log = log
- wxScrolledPanel.__init__( self, parent, -1 )
- self.sizer = wxBoxSizer( wxVERTICAL )
- label = wxStaticText( self, -1, """\
-These are examples of wxMaskedComboBox and wxIpAddrCtrl, and more useful
-configurations of a wxMaskedTextCtrl for integer and floating point input.
-""")
- label.SetForegroundColour( "Blue" )
- self.sizer.Add( label, 0, wxALIGN_LEFT|wxALL, 5 )
+ scroll.ScrolledPanel.__init__( self, parent, -1 )
+ self.sizer = wx.BoxSizer( wx.VERTICAL )
+
+
+ labelMaskedCombos = wx.StaticText( self, -1, """\
+These are some examples of MaskedComboBox:""")
+ labelMaskedCombos.SetForegroundColour( "Blue" )
+
+
+ label_statecode = wx.StaticText( self, -1, """\
+A state selector; only
+"legal" values can be
+entered:""")
+ statecode = med.MaskedComboBox( self, -1, med.states[0],
+ choices = med.states,
+ autoformat="USSTATE")
+
+ label_statename = wx.StaticText( self, -1, """\
+A state name selector,
+with auto-select:""")
+
+ # Create this one using factory function:
+ statename = mctl.MaskedCtrl( self, -1, med.state_names[0],
+ controlType = mctl.controlTypes.MASKEDCOMBO,
+ choices = med.state_names,
+ autoformat="USSTATENAME",
+ autoSelect=True)
+ statename.SetCtrlParameters(formatcodes = 'F!V_')
+
numerators = [ str(i) for i in range(1, 4) ]
denominators = [ string.ljust(str(i), 2) for i in [2,3,4,5,8,16,32,64] ]
- fieldsDict = {0: Field(choices=numerators, choiceRequired=False),
- 1: Field(choices=denominators, choiceRequired=True)}
+ fieldsDict = {0: med.Field(choices=numerators, choiceRequired=False),
+ 1: med.Field(choices=denominators, choiceRequired=True)}
choices = []
for n in numerators:
for d in denominators:
choices.append( '%s/%s' % (n,d) )
- text1 = wxStaticText( self, -1, """\
+ label_fraction = wx.StaticText( self, -1, """\
A masked ComboBox for fraction selection.
-Choices for each side of the fraction can be
-selected with PageUp/Down:""")
+Choices for each side of the fraction can
+be selected with PageUp/Down:""")
- fraction = wxMaskedComboBox( self, -1, "",
- choices = choices,
- choiceRequired = True,
- mask = "#/##",
- formatcodes = "F_",
- validRegex = "^\d\/\d\d?",
- fields = fieldsDict )
+ fraction = mctl.MaskedCtrl( self, -1, "",
+ controlType = mctl.MASKEDCOMBO,
+ choices = choices,
+ choiceRequired = True,
+ mask = "#/##",
+ formatcodes = "F_",
+ validRegex = "^\d\/\d\d?",
+ fields = fieldsDict )
- text2 = wxStaticText( self, -1, """
+ label_code = wx.StaticText( self, -1, """\
A masked ComboBox to validate
text from a list of numeric codes:""")
choices = ["91", "136", "305", "4579"]
- code = wxMaskedComboBox( self, -1, choices[0],
+ code = med.MaskedComboBox( self, -1, choices[0],
choices = choices,
choiceRequired = True,
formatcodes = "F_r",
mask = "####")
+ label_selector = wx.StaticText( self, -1, """\
+Programmatically set
+choice sets:""")
+ self.list_selector = wx.ComboBox(self, -1, '', choices = ['list1', 'list2', 'list3'])
+ self.dynamicbox = mctl.MaskedCtrl( self, -1, ' ',
+ controlType = mctl.controlTypes.MASKEDCOMBO,
+ mask = 'XXXX',
+ formatcodes = 'F_',
+ # these are to give dropdown some initial height,
+ # as base control apparently only sets that size
+ # during initial construction <sigh>:
+ choices = ['', '1', '2', '3', '4', '5'] )
- text3 = wxStaticText( self, -1, """\
-A masked state selector; only "legal" values
-can be entered:""")
+ self.dynamicbox.Clear() # get rid of initial choices used to size the dropdown
- state = wxMaskedComboBox( self, -1, states[0],
- choices = states,
- autoformat="USSTATE")
- text4 = wxStaticText( self, -1, "An empty IP Address entry control:")
- ip_addr1 = wxIpAddrCtrl( self, -1, style = wxTE_PROCESS_TAB )
+ labelIpAddrs = wx.StaticText( self, -1, """\
+Here are some examples of IpAddrCtrl, a control derived from MaskedTextCtrl:""")
+ labelIpAddrs.SetForegroundColour( "Blue" )
+
+ label_ipaddr1 = wx.StaticText( self, -1, "An empty control:")
+ ipaddr1 = med.IpAddrCtrl( self, -1, style = wx.TE_PROCESS_TAB )
- text5 = wxStaticText( self, -1, "An IP Address control with a restricted mask:")
- ip_addr2 = wxIpAddrCtrl( self, -1, mask=" 10. 1.109.###" )
+ label_ipaddr2 = wx.StaticText( self, -1, "A restricted mask:")
+ ipaddr2 = med.IpAddrCtrl( self, -1, mask=" 10. 1.109.###" )
- text6 = wxStaticText( self, -1, """\
-An IP Address control with restricted choices
-of form: 10. (1|2) . (129..255) . (0..255)""")
- ip_addr3 = wxIpAddrCtrl( self, -1, mask=" 10. #.###.###")
- ip_addr3.SetFieldParameters(0, validRegex="1|2" ) # requires entry to match or not allowed
+ label_ipaddr3 = wx.StaticText( self, -1, """\
+A control with restricted legal values:
+10. (1|2) . (129..255) . (0..255)""")
+ ipaddr3 = mctl.MaskedCtrl( self, -1,
+ controlType = mctl.controlTypes.IPADDR,
+ mask=" 10. #.###.###")
+ ipaddr3.SetFieldParameters(0, validRegex="1|2",validRequired=False ) # requires entry to match or not allowed
# This allows any value in penultimate field, but colors anything outside of the range invalid:
- ip_addr3.SetFieldParameters(1, validRange=(129,255), validRequired=False )
+ ipaddr3.SetFieldParameters(1, validRange=(129,255), validRequired=False )
- text7 = wxStaticText( self, -1, """\
-A right-insert integer entry control:""")
- intctrl = wxMaskedTextCtrl(self, -1, name='intctrl', mask="#{9}", formatcodes = '_-r,F')
- text8 = wxStaticText( self, -1, """\
+
+ labelNumerics = wx.StaticText( self, -1, """\
+Here are some useful configurations of a MaskedTextCtrl for integer and floating point input that still treat
+the control as a text control. (For a true numeric control, check out the MaskedNumCtrl class!)""")
+ labelNumerics.SetForegroundColour( "Blue" )
+
+ label_intctrl1 = wx.StaticText( self, -1, """\
+An integer entry control with
+shifting insert enabled:""")
+ self.intctrl1 = med.MaskedTextCtrl(self, -1, name='intctrl', mask="#{9}", formatcodes = '_-,F>')
+ label_intctrl2 = wx.StaticText( self, -1, """\
+ Right-insert integer entry:""")
+ self.intctrl2 = med.MaskedTextCtrl(self, -1, name='intctrl', mask="#{9}", formatcodes = '_-,Fr')
+
+ label_floatctrl = wx.StaticText( self, -1, """\
A floating point entry control
with right-insert for ordinal:""")
- self.floatctrl = wxMaskedTextCtrl(self, -1, name='floatctrl', mask="#{9}.#{2}", formatcodes="F,_-R")
+ self.floatctrl = med.MaskedTextCtrl(self, -1, name='floatctrl', mask="#{9}.#{2}", formatcodes="F,_-R", useParensForNegatives=False)
self.floatctrl.SetFieldParameters(0, formatcodes='r<', validRequired=True) # right-insert, require explicit cursor movement to change fields
self.floatctrl.SetFieldParameters(1, defaultValue='00') # don't allow blank fraction
- text9 = wxStaticText( self, -1, """\
-Use this control to programmatically set
-the value of the above float control:""")
- number_combo = wxComboBox(self, -1, choices = [ '', '111', '222.22', '-3', '54321.666666666', '-1353.978',
- '1234567', '-1234567', '123456789', '-123456789.1',
- '1234567890.', '-1234567890.1' ])
-
- grid = wxFlexGridSizer( 0, 2, vgap=10, hgap = 5 )
- grid.Add( text1, 0, wxALIGN_LEFT )
- grid.Add( fraction, 0, wxALIGN_LEFT )
- grid.Add( text2, 0, wxALIGN_LEFT )
- grid.Add( code, 0, wxALIGN_LEFT )
- grid.Add( text3, 0, wxALIGN_LEFT )
- grid.Add( state, 0, wxALIGN_LEFT )
- grid.Add( text4, 0, wxALIGN_LEFT )
- grid.Add( ip_addr1, 0, wxALIGN_LEFT )
- grid.Add( text5, 0, wxALIGN_LEFT )
- grid.Add( ip_addr2, 0, wxALIGN_LEFT )
- grid.Add( text6, 0, wxALIGN_LEFT )
- grid.Add( ip_addr3, 0, wxALIGN_LEFT )
- grid.Add( text7, 0, wxALIGN_LEFT )
- grid.Add( intctrl, 0, wxALIGN_LEFT )
- grid.Add( text8, 0, wxALIGN_LEFT )
- grid.Add( self.floatctrl, 0, wxALIGN_LEFT )
- grid.Add( text9, 0, wxALIGN_LEFT )
- grid.Add( number_combo, 0, wxALIGN_LEFT )
-
- self.sizer.Add( grid, 0, wxALIGN_LEFT|wxALL, border=5 )
+ label_numselect = wx.StaticText( self, -1, """\
+<= Programmatically set the value
+ of the float entry ctrl:""")
+ numselect = wx.ComboBox(self, -1, choices = [ '', '111', '222.22', '-3', '54321.666666666', '-1353.978',
+ '1234567', '-1234567', '123456789', '-123456789.1',
+ '1234567890.', '-1234567890.1' ])
+
+ parens_check = wx.CheckBox(self, -1, "Use () to indicate negatives in above controls")
+
+
+
+ gridCombos = wx.FlexGridSizer( 0, 4, vgap=10, hgap = 10 )
+ gridCombos.Add( label_statecode, 0, wx.ALIGN_LEFT )
+ gridCombos.Add( statecode, 0, wx.ALIGN_LEFT )
+ gridCombos.Add( label_fraction, 0, wx.ALIGN_LEFT )
+ gridCombos.Add( fraction, 0, wx.ALIGN_LEFT )
+ gridCombos.Add( label_statename, 0, wx.ALIGN_LEFT )
+ gridCombos.Add( statename, 0, wx.ALIGN_LEFT )
+ gridCombos.Add( label_code, 0, wx.ALIGN_LEFT )
+ gridCombos.Add( code, 0, wx.ALIGN_LEFT )
+ gridCombos.Add( label_selector, 0, wx.ALIGN_LEFT)
+ hbox = wx.BoxSizer( wx.HORIZONTAL )
+ hbox.Add( self.list_selector, 0, wx.ALIGN_LEFT )
+ hbox.Add(wx.StaticText(self, -1, ' => '), 0, wx.ALIGN_LEFT)
+ hbox.Add( self.dynamicbox, 0, wx.ALIGN_LEFT )
+ gridCombos.Add( hbox, 0, wx.ALIGN_LEFT )
+
+ gridIpAddrs = wx.FlexGridSizer( 0, 4, vgap=10, hgap = 15 )
+ gridIpAddrs.Add( label_ipaddr1, 0, wx.ALIGN_LEFT )
+ gridIpAddrs.Add( ipaddr1, 0, wx.ALIGN_LEFT )
+ gridIpAddrs.Add( label_ipaddr2, 0, wx.ALIGN_LEFT )
+ gridIpAddrs.Add( ipaddr2, 0, wx.ALIGN_LEFT )
+ gridIpAddrs.Add( label_ipaddr3, 0, wx.ALIGN_LEFT )
+ gridIpAddrs.Add( ipaddr3, 0, wx.ALIGN_LEFT )
+
+ gridNumerics = wx.FlexGridSizer( 0, 4, vgap=10, hgap = 10 )
+ gridNumerics.Add( label_intctrl1, 0, wx.ALIGN_LEFT )
+ gridNumerics.Add( self.intctrl1, 0, wx.ALIGN_LEFT )
+ gridNumerics.Add( label_intctrl2, 0, wx.ALIGN_RIGHT )
+ gridNumerics.Add( self.intctrl2, 0, wx.ALIGN_LEFT )
+ gridNumerics.Add( label_floatctrl, 0, wx.ALIGN_LEFT )
+ gridNumerics.Add( self.floatctrl, 0, wx.ALIGN_LEFT )
+ gridNumerics.Add( label_numselect, 0, wx.ALIGN_RIGHT )
+ gridNumerics.Add( numselect, 0, wx.ALIGN_LEFT )
+
+ self.sizer.Add( labelMaskedCombos, 0, wx.ALIGN_LEFT|wx.ALL, 5 )
+ self.sizer.Add( gridCombos, 0, wx.ALIGN_LEFT|wx.ALL, border=5 )
+ self.sizer.Add( wx.StaticLine(self, -1), 0, wx.EXPAND|wx.TOP|wx.BOTTOM, border=8 )
+ self.sizer.Add( labelIpAddrs, 0, wx.ALIGN_LEFT|wx.ALL, 5 )
+ self.sizer.Add( gridIpAddrs, 0, wx.ALIGN_LEFT|wx.ALL, border=5 )
+ self.sizer.Add( wx.StaticLine(self, -1), 0, wx.EXPAND|wx.TOP|wx.BOTTOM, border=8 )
+ self.sizer.Add( labelNumerics, 0, wx.ALIGN_LEFT|wx.ALL, 5 )
+ self.sizer.Add( gridNumerics, 0, wx.ALIGN_LEFT|wx.ALL, border=5 )
+ self.sizer.Add( parens_check, 0, wx.ALIGN_LEFT|wx.ALL, 5 )
+
self.SetSizer( self.sizer )
self.SetAutoLayout(1)
self.SetupScrolling()
- EVT_COMBOBOX( self, fraction.GetId(), self.OnComboChange )
- EVT_COMBOBOX( self, code.GetId(), self.OnComboChange )
- EVT_COMBOBOX( self, state.GetId(), self.OnComboChange )
- EVT_TEXT( self, fraction.GetId(), self.OnComboChange )
- EVT_TEXT( self, code.GetId(), self.OnComboChange )
- EVT_TEXT( self, state.GetId(), self.OnComboChange )
+ self.Bind(wx.EVT_COMBOBOX, self.OnComboSelection, id=fraction.GetId())
+ self.Bind(wx.EVT_COMBOBOX, self.OnComboSelection, id=code.GetId())
+ self.Bind(wx.EVT_COMBOBOX, self.OnComboSelection, id=statecode.GetId())
+ self.Bind(wx.EVT_COMBOBOX, self.OnComboSelection, id=statename.GetId())
+ self.Bind(wx.EVT_TEXT, self.OnTextChange, id=code.GetId())
+ self.Bind(wx.EVT_TEXT, self.OnTextChange, id=statecode.GetId())
+ self.Bind(wx.EVT_TEXT, self.OnTextChange, id=statename.GetId())
+ self.Bind(wx.EVT_COMBOBOX, self.OnListSelection, id=self.list_selector.GetId())
+
+ self.Bind(wx.EVT_TEXT, self.OnTextChange, id=self.intctrl1.GetId())
+ self.Bind(wx.EVT_TEXT, self.OnTextChange, id=self.intctrl2.GetId())
+ self.Bind(wx.EVT_TEXT, self.OnTextChange, id=self.floatctrl.GetId())
+ self.Bind(wx.EVT_COMBOBOX, self.OnNumberSelect, id=numselect.GetId())
+ self.Bind(wx.EVT_CHECKBOX, self.OnParensCheck, id=parens_check.GetId())
- EVT_TEXT( self, ip_addr1.GetId(), self.OnIpAddrChange )
- EVT_TEXT( self, ip_addr2.GetId(), self.OnIpAddrChange )
- EVT_TEXT( self, ip_addr3.GetId(), self.OnIpAddrChange )
- EVT_TEXT( self, intctrl.GetId(), self.OnTextChange )
- EVT_TEXT( self, self.floatctrl.GetId(), self.OnTextChange )
- EVT_COMBOBOX( self, number_combo.GetId(), self.OnNumberSelect )
+ self.Bind(wx.EVT_TEXT, self.OnIpAddrChange, id=ipaddr1.GetId())
+ self.Bind(wx.EVT_TEXT, self.OnIpAddrChange, id=ipaddr2.GetId())
+ self.Bind(wx.EVT_TEXT, self.OnIpAddrChange, id=ipaddr3.GetId())
- def OnComboChange( self, event ):
+
+
+ def OnComboSelection( self, event ):
ctl = self.FindWindowById( event.GetId() )
if not ctl.IsValid():
self.log.write('current value not a valid choice')
-
- def OnIpAddrChange( self, event ):
- ip_addr = self.FindWindowById( event.GetId() )
- if ip_addr.IsValid():
- self.log.write('new addr = %s\n' % ip_addr.GetAddress() )
+ self.log.write('new value = %s' % ctl.GetValue())
def OnTextChange( self, event ):
ctl = self.FindWindowById( event.GetId() )
def OnNumberSelect( self, event ):
value = event.GetString()
-
# Format choice to fit into format for #{9}.#{2}, with sign position reserved:
# (ordinal + fraction == 11 + decimal point + sign == 13)
- #
- # Note: since self.floatctrl a right-aligned control, you could also just use
- # "%.2f", but this wouldn't work properly for a left-aligned control.
- # (See .SetValue() documentation in Overview.)
- #
if value:
floattext = "%13.2f" % float(value)
else:
for line in traceback.format_exception_only(type, value):
self.log.write(line)
+ def OnParensCheck( self, event ):
+ self.intctrl1.SetCtrlParameters(useParensForNegatives=event.IsChecked())
+ self.intctrl2.SetCtrlParameters(useParensForNegatives=event.IsChecked())
+ self.floatctrl.SetCtrlParameters(useParensForNegatives=event.IsChecked())
+
+ def OnIpAddrChange( self, event ):
+ ipaddr = self.FindWindowById( event.GetId() )
+ if ipaddr.IsValid():
+ self.log.write('new addr = %s\n' % ipaddr.GetAddress() )
+
+ def OnListSelection( self, event ):
+ list = self.list_selector.GetStringSelection()
+ formatcodes = 'F_'
+ if list == 'list1':
+ choices = ['abc', 'defg', 'hi']
+ mask = 'aaaa'
+ elif list == 'list2':
+ choices = ['1', '2', '34', '567']
+ formatcodes += 'r'
+ mask = '###'
+ else:
+ choices = med.states
+ mask = 'AA'
+ formatcodes += '!'
+ self.dynamicbox.SetCtrlParameters( mask = mask,
+ choices = choices,
+ choiceRequired=True,
+ autoSelect=True,
+ formatcodes=formatcodes)
+ self.dynamicbox.SetValue(choices[0])
+
# ---------------------------------------------------------------------
-class TestMaskedTextCtrls(wxNotebook):
+class TestMaskedTextCtrls(wx.Notebook):
def __init__(self, parent, id, log):
- wxNotebook.__init__(self, parent, id)
+ wx.Notebook.__init__(self, parent, id)
self.log = log
win = demoPage1(self, log)
return testWin
def RunStandalone():
- app = wxPySimpleApp()
- frame = wxFrame(None, -1, "Test wxMaskedTextCtrl", size=(640, 480))
+ app = wx.PySimpleApp()
+ frame = wx.Frame(None, -1, "Test MaskedTextCtrl", size=(640, 480))
win = TestMaskedTextCtrls(frame, -1, sys.stdout)
frame.Show(True)
app.MainLoop()
#----------------------------------------------------------------------------
-if __name__ == "__main__":
- RunStandalone()
-
overview = """<html>
<PRE><FONT SIZE=-1>
-""" + overviewdoc + """
+""" + med.__doc__ + """
</FONT></PRE>
"""
if __name__ == "__main__":
import sys,os
import run
- run.main(['', os.path.basename(sys.argv[0])])
+ run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])