Mega Code Archive

 
Categories / Python / GUI Pmw
 

Subclassing Pmw EntryField

title = 'Subclassing Pmw.EntryField' # Import Pmw from this directory tree. import sys sys.path[:0] = ['../../..'] import string import time import types import Tkinter import Pmw class SpecialEntry(Pmw.EntryField):     def __init__(self, parent=None , **kw):         kw['extravalidators'] = _myValidators   apply(Pmw.EntryField.__init__, (self, parent), kw)   self._converter = None     def setentry(self, text):   # Override Pmw.EntryField.setentry to pass string through   # the appropriate converter.   val = self['validate']   if type(val) == types.DictionaryType:       val = val['validator']   if _converters.has_key(val):       text = _converters[val](text, output = 0)   Pmw.EntryField.setentry(self, text)     def getentry(self):   text = self.get()   val = self['validate']   if type(val) == types.DictionaryType:       val = val['validator']   if _converters.has_key(val):       return _converters[val](text, output = 1)   else:       return text def _date(text):     return Pmw.datevalidator(text, 'dmy', '.') def _real(text):     return Pmw.realvalidator(text, ',') def _dateconv(text, output = 0):     # On output, convert from dd.mm.yy to mm-dd-yy.  On input, convert     # mm-dd-yy to dd.mm.yy and also from +NN+ or -NN- to date NN days     # before or after today.     if len(text) == 0:   return ''     if output:   try:       d = string.split(text, '.')       return d[1] + '-' + d[0] + '-' + d[2]   except:       return text     else:   if text[-1] == '+' or text[-1] == '-':       text = text[:-1]   if text[0] == '+' or text[0] == '-':             secondsAhead = string.atoi(text) * 3600 * 24       return time.strftime('%d.%m.%Y',                     time.localtime(time.time() + secondsAhead))   try:       d = string.split(text,'-')       return d[1] + '.' + d[0] + '.' + d[2]   except:       return text def _realconv(text, output = 0):     # Convert between DD.DD and DD,DD.     if output:   index = string.find(text, ',')   if index >= 0:       return text[:index] + '.' + text[index + 1:]   else:       return text     else:   index = string.find(text, '.')   if index >= 0:       return text[:index] + ',' + text[index + 1:]   else:       return text _converters = {     'real' : _realconv,     'float8' : _realconv,     'date' : _dateconv } _myValidators = {     'date' : (_date, lambda s: Pmw.datestringtojdn(s, 'dmy', '.')),     'real' : (_real, lambda s: string.atof(_realconv(s, 1))),     'int4' : ('numeric', 'numeric'),     'oid' : ('int4', 'int4'),     'float8' : ('real', 'real'),     'varchar' : ('alphanumeric', 'alphanumeric'),     'text' : ('alphanumeric', 'alphanumeric'), } class Demo:     def __init__(self, parent):   # Create and pack the SpecialEntry megawidgets.   self._real = SpecialEntry(parent,     labelpos = 'w',     label_text = 'Real (max 2,5e+9):',     validate = {'validator' : 'real', 'max' : +2.5e+9},     )   self._real.setentry('+2.5e+6')   self._date = SpecialEntry(parent,     labelpos = 'w',     label_text = 'Date (dd.mm.yy):',     validate = 'date',     modifiedcommand = self.changed     )         # Set entry to one week from now, using special intput format.   self._date.setentry('+7+')   entries = (self._real, self._date)   for entry in entries:       entry.pack(fill='x', expand=1, padx=10, pady=5)   Pmw.alignlabels(entries)     def changed(self):   print 'Text changed, converted value is', self._date.getentry()     def execute(self):   print 'Return pressed, value is', self._any.get()     # This implements a custom validation routine.  It simply checks     # if the string is of odd length.     def custom_validate(self, text):   print 'text:', text   if len(text) % 2 == 0:     return -1   else:     return 1 ###################################################################### # Create demo in root window for testing. if __name__ == '__main__':     root = Tkinter.Tk()     Pmw.initialise(root)     root.title(title)     exitButton = Tkinter.Button(root, text = 'Exit', command = root.destroy)     exitButton.pack(side = 'bottom')     widget = Demo(root)     root.mainloop()