📄 maskededit.py
字号:
'excludeChars': am_pm_exclude,
'formatcodes': 'DF!',
'validRegex': '^' + days + '/' + months + '/' + '\d{4} ' + hours + ':' + minutes + ' (A|P)M',
'description': "DD/MM/YYYY HH:MM"
},
"EUDATETIMEDDMMYYYY.HHMM": {
'mask': "##.##.#### ##:## AM",
'excludeChars': am_pm_exclude,
'formatcodes': 'DF!',
'validRegex': '^' + days + '.' + months + '.' + '\d{4} ' + hours + ':' + minutes + ' (A|P)M',
'description': "DD.MM.YYYY HH:MM"
},
"EUDATE24HRTIMEYYYYMMDD/HHMMSS": {
'mask': "####/##/## ##:##:##",
'formatcodes': 'DF',
'validRegex': '^' + '\d{4}'+ '/' + months + '/' + days + ' ' + milhours + ':' + minutes + ':' + seconds,
'description': "YYYY/MM/DD 24Hr Time"
},
"EUDATE24HRTIMEYYYYMMDD.HHMMSS": {
'mask': "####.##.## ##:##:##",
'formatcodes': 'DF',
'validRegex': '^' + '\d{4}'+ '.' + months + '.' + days + ' ' + milhours + ':' + minutes + ':' + seconds,
'description': "YYYY.MM.DD 24Hr Time"
},
"EUDATE24HRTIMEDDMMYYYY/HHMMSS": {
'mask': "##/##/#### ##:##:##",
'formatcodes': 'DF',
'validRegex': '^' + days + '/' + months + '/' + '\d{4} ' + milhours + ':' + minutes + ':' + seconds,
'description': "DD/MM/YYYY 24Hr Time"
},
"EUDATE24HRTIMEDDMMYYYY.HHMMSS": {
'mask': "##.##.#### ##:##:##",
'formatcodes': 'DF',
'validRegex': '^' + days + '.' + months + '.' + '\d{4} ' + milhours + ':' + minutes + ':' + seconds,
'description': "DD.MM.YYYY 24Hr Time"
},
"EUDATE24HRTIMEYYYYMMDD/HHMM": {
'mask': "####/##/## ##:##",
'formatcodes': 'DF','validRegex': '^' + '\d{4}'+ '/' + months + '/' + days + ' ' + milhours + ':' + minutes,
'description': "YYYY/MM/DD 24Hr Time\n(w/o seconds)"
},
"EUDATE24HRTIMEYYYYMMDD.HHMM": {
'mask': "####.##.## ##:##",
'formatcodes': 'DF',
'validRegex': '^' + '\d{4}'+ '.' + months + '.' + days + ' ' + milhours + ':' + minutes,
'description': "YYYY.MM.DD 24Hr Time\n(w/o seconds)"
},
"EUDATE24HRTIMEDDMMYYYY/HHMM": {
'mask': "##/##/#### ##:##",
'formatcodes': 'DF',
'validRegex': '^' + days + '/' + months + '/' + '\d{4} ' + milhours + ':' + minutes,
'description': "DD/MM/YYYY 24Hr Time\n(w/o seconds)"
},
"EUDATE24HRTIMEDDMMYYYY.HHMM": {
'mask': "##.##.#### ##:##",
'formatcodes': 'DF',
'validRegex': '^' + days + '.' + months + '.' + '\d{4} ' + milhours + ':' + minutes,
'description': "DD.MM.YYYY 24Hr Time\n(w/o seconds)"
},
"TIMEHHMMSS": {
'mask': "##:##:## AM",
'excludeChars': am_pm_exclude,
'formatcodes': 'TF!',
'validRegex': '^' + hours + ':' + minutes + ':' + seconds + ' (A|P)M',
'description': "HH:MM:SS (A|P)M\n(see TimeCtrl)"
},
"TIMEHHMM": {
'mask': "##:## AM",
'excludeChars': am_pm_exclude,
'formatcodes': 'TF!',
'validRegex': '^' + hours + ':' + minutes + ' (A|P)M',
'description': "HH:MM (A|P)M\n(see TimeCtrl)"
},
"24HRTIMEHHMMSS": {
'mask': "##:##:##",
'formatcodes': 'TF',
'validRegex': '^' + milhours + ':' + minutes + ':' + seconds,
'description': "24Hr HH:MM:SS\n(see TimeCtrl)"
},
"24HRTIMEHHMM": {
'mask': "##:##",
'formatcodes': 'TF',
'validRegex': '^' + milhours + ':' + minutes,
'description': "24Hr HH:MM\n(see TimeCtrl)"
},
"USSOCIALSEC": {
'mask': "###-##-####",
'formatcodes': 'F',
'validRegex': "\d{3}-\d{2}-\d{4}",
'description': "Social Sec#"
},
"CREDITCARD": {
'mask': "####-####-####-####",
'formatcodes': 'F',
'validRegex': "\d{4}-\d{4}-\d{4}-\d{4}",
'description': "Credit Card"
},
"EXPDATEMMYY": {
'mask': "##/##",
'formatcodes': "F",
'validRegex': "^" + months + "/\d\d",
'description': "Expiration MM/YY"
},
"USZIP": {
'mask': "#####",
'formatcodes': 'F',
'validRegex': "^\d{5}",
'description': "US 5-digit zip code"
},
"USZIPPLUS4": {
'mask': "#####-####",
'formatcodes': 'F',
'validRegex': "\d{5}-(\s{4}|\d{4})",
'description': "US zip+4 code"
},
"PERCENT": {
'mask': "0.##",
'formatcodes': 'F',
'validRegex': "^0.\d\d",
'description': "Percentage"
},
"AGE": {
'mask': "###",
'formatcodes': "F",
'validRegex': "^[1-9]{1} |[1-9][0-9] |1[0|1|2][0-9]",
'description': "Age"
},
"EMAIL": {
'mask': "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
'excludeChars': " \\/*&%$#!+='\"",
'formatcodes': "F>",
'validRegex': "^\w+([\-\.]\w+)*@((([a-zA-Z0-9]+(\-[a-zA-Z0-9]+)*\.)+)[a-zA-Z]{2,4}|\[(\d|\d\d|(1\d\d|2[0-4]\d|25[0-5]))(\.(\d|\d\d|(1\d\d|2[0-4]\d|25[0-5]))){3}\]) *$",
'description': "Email address"
},
"IPADDR": {
'mask': "###.###.###.###",
'formatcodes': 'F_Sr',
'validRegex': "( \d| \d\d|(1\d\d|2[0-4]\d|25[0-5]))(\.( \d| \d\d|(1\d\d|2[0-4]\d|25[0-5]))){3}",
'description': "IP Address\n(see IpAddrCtrl)"
}
}
# build demo-friendly dictionary of descriptions of autoformats
autoformats = []
for key, value in masktags.items():
autoformats.append((key, value['description']))
autoformats.sort()
## ---------- ---------- ---------- ---------- ---------- ---------- ----------
class Field:
"""
This class manages the individual fields in a masked edit control.
Each field has a zero-based index, indicating its position in the
control, an extent, an associated mask, and a plethora of optional
parameters. Fields can be instantiated and then associated with
parent masked controls, in order to provide field-specific configuration.
Alternatively, fields will be implicitly created by the parent control
if not provided at construction, at which point, the fields can then
manipulated by the controls .SetFieldParameters() method.
"""
valid_params = {
'index': None, ## which field of mask; set by parent control.
'mask': "", ## mask chars for this field
'extent': (), ## (edit start, edit_end) of field; set by parent control.
'formatcodes': "", ## codes indicating formatting options for the control
'fillChar': ' ', ## used as initial value for each mask position if initial value is not given
'groupChar': ',', ## used with numeric fields; indicates what char groups 3-tuple digits
'decimalChar': '.', ## used with numeric fields; indicates what char separates integer from fraction
'shiftDecimalChar': '>', ## used with numeric fields, indicates what is above the decimal point char on keyboard
'useParensForNegatives': False, ## used with numeric fields, indicates that () should be used vs. - to show negative numbers.
'defaultValue': "", ## use if you want different positional defaults vs. all the same fillChar
'excludeChars': "", ## optional string of chars to exclude even if main mask type does
'includeChars': "", ## optional string of chars to allow even if main mask type doesn't
'validRegex': "", ## optional regular expression to use to validate the control
'validRange': (), ## Optional hi-low range for numerics
'choices': [], ## Optional list for character expressions
'choiceRequired': False, ## If choices supplied this specifies if valid value must be in the list
'compareNoCase': False, ## Optional flag to indicate whether or not to use case-insensitive list search
'autoSelect': False, ## Set to True to try auto-completion on each keystroke:
'validFunc': None, ## Optional function for defining additional, possibly dynamic validation constraints on contrl
'validRequired': False, ## Set to True to disallow input that results in an invalid value
'emptyInvalid': False, ## Set to True to make EMPTY = INVALID
'description': "", ## primarily for autoformats, but could be useful elsewhere
}
# This list contains all parameters that when set at the control level should
# propagate down to each field:
propagating_params = ('fillChar', 'groupChar', 'decimalChar','useParensForNegatives',
'compareNoCase', 'emptyInvalid', 'validRequired')
def __init__(self, **kwargs):
"""
This is the "constructor" for setting up parameters for fields.
a field_index of -1 is used to indicate "the entire control."
"""
#### dbg('Field::Field', indent=1)
# Validate legitimate set of parameters:
for key in kwargs.keys():
if key not in Field.valid_params.keys():
#### dbg(indent=0)
raise TypeError('invalid parameter "%s"' % (key))
# Set defaults for each parameter for this instance, and fully
# populate initial parameter list for configuration:
for key, value in Field.valid_params.items():
setattr(self, '_' + key, copy.copy(value))
if not kwargs.has_key(key):
kwargs[key] = copy.copy(value)
self._autoCompleteIndex = -1
self._SetParameters(**kwargs)
self._ValidateParameters(**kwargs)
#### dbg(indent=0)
def _SetParameters(self, **kwargs):
"""
This function can be used to set individual or multiple parameters for
a masked edit field parameter after construction.
"""
## dbg(suspend=1)
## dbg('maskededit.Field::_SetParameters', indent=1)
# Validate keyword arguments:
for key in kwargs.keys():
if key not in Field.valid_params.keys():
## dbg(indent=0, suspend=0)
raise AttributeError('invalid keyword argument "%s"' % key)
## if self._index is not None: dbg('field index:', self._index)
## dbg('parameters:', indent=1)
for key, value in kwargs.items():
## dbg('%s:' % key, value)
pass
## dbg(indent=0)
old_fillChar = self._fillChar # store so we can change choice lists accordingly if it changes
# First, Assign all parameters specified:
for key in Field.valid_params.keys():
if kwargs.has_key(key):
setattr(self, '_' + key, kwargs[key] )
if kwargs.has_key('formatcodes'): # (set/changed)
self._forceupper = '!' in self._formatcodes
self._forcelower = '^' in self._formatcodes
self._groupdigits = ',' in self._formatcodes
self._okSpaces = '_' in self._formatcodes
self._padZero = '0' in self._formatcodes
self._autofit = 'F' in self._formatcodes
self._insertRight = 'r' in self._formatcodes
self._allowInsert = '>' in self._formatcodes
self._alignRight = 'R' in self._formatcodes or 'r' in self._formatcodes
self._moveOnFieldFull = not '<' in self._formatcodes
self._selectOnFieldEntry = 'S' in self._formatcodes
if kwargs.has_key('groupChar'):
self._groupChar = kwargs['groupChar']
if kwargs.has_key('decimalChar'):
self._decimalChar = kwargs['decimalChar']
if kwargs.has_key('shiftDecimalChar'):
self._shiftDecimalChar = kwargs['shiftDecimalChar']
if kwargs.has_key('formatcodes') or kwargs.has_key('validRegex')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -