Ce hack est maintenant transformé en classe StrictComboBox .
In the previous article "PythonMegaWidget (Pmw) ComboBox restreind à une liste de valeur" I did explain how to restrict the selected value to a given list of values.
That hack has been converted to the StrictComboBox class.
class StrictComboBox( Pmw.ComboBox ):
""" Pmw.ComboBox that strictly restrict the selection to the list of items stored in the "items" keyword
Thank to RL_ScrolledText class for their wonderfull example
http://www.reportlab.com/examples/frml/old/rlextra/src/rlextra/graphics/guiedit/guidialogs.py
"""
_items = None # List of combobox items
def __init__( self, *args, **kw ):
# Take a local copy of some property
for a in ['items']:
print( a )
if a in list(kw.keys()):
print( ' --removed')
v=kw[a]
del kw[a]
else:
v=None
setattr(self,a,v)
# add the items to combobox + validator
kw['scrolledlist_items'] = self.items
kw['entryfield_extravalidators'] = { 'strictselect' : (self.strictselect_validate, self.strictselect_stringtovalue) }
kw['entryfield_validate'] = { 'validator' : 'strictselect' }
Pmw.ComboBox.__init__( *(self,)+args, **kw )
w = self._entryfield = self.component('entryfield')
self.initialiseoptions(StrictComboBox)
def destroy(self):
Pmw.ComboBox.destroy( self )
def strictselect_validate(self, avalue):
""" called by ComboBox entry field to validate the keyIn value """
print( 'validate: %s' % avalue )
if avalue in self.items:
return Pmw.OK
elif any( [avalue in v for v in self.items] ):
return Pmw.PARTIAL
else:
return Pmw.ERROR
def strictselect_stringtovalue(self, avalue):
""" Not called since we did not defined min and max values """
return None
Qui s'utilise comme ceci:
And you can use it like that:
# StrictComboBox
f = Frame( fbody )
l = Label( f, text="Prefered Parent", anchor=W, width=15 ).pack( side=LEFT, expand=N )
combobox4 = StrictComboBox( f, items=['Dady','Mom','Sister','Grandpa'],
labelpos='wn', listbox_width=24, dropdown=1, # selectioncommand=choseEntry,
entry_state = 'disabled', entry_bg='white', entry_fg='black' )
combobox4.pack( side=LEFT, expand=N )
fields.append( (combobox4, None) ) # the Field and the string variable
f.pack( side=TOP, expand=N, fill=X )
Aucun commentaire:
Enregistrer un commentaire