Conseil à propos Entry widget
Bonjour à tout le monde,
j'ai besoin d'un conseil à propos de la widget Entry.
Je voudrais créer une widget Entry qui exécute diverses fonctions lorsque l'utilisateur la modifie (e.g. vérifie que le contenu est un entier, lance un file browser, ...).
Le code ci-dessous fonctionne mais je voulais vous le soumettre pour avoir votre avis sur sa qualité. Est-il 'propre' ? Auriez-vous une solution plus élégante/générale ?
Pour des raisons techniques, je dois rester en Tk (même pas Tix).
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| from Tkinter import *
from tkFileDialog import askopenfilename, asksaveasfilename
# Premier exemple de fonction à fournir
def test(value, *args, **kwargs):
print 'value:', value
print 'args:', args
return True
# Second exemple de fonction à fournir
def browse(value, parent = None):
filename = asksaveasfilename(parent = parent)
return filename
# La nouvelle widget Entry
class ExtendedEntry(Entry):
def __init__(self, master, action = None, actionArgs = None, **kwargs):
if kwargs.has_key('textvariable'):
self.variable = kwargs['textvariable']
del kwargs['textvariable']
elif kwargs.has_key('text'):
self.variable = StringVar()
self.variable.set(str(kwargs['text']))
del kwargs['text']
else:
self.variable = StringVar()
Entry.__init__(self, master, textvariable = self.variable, **kwargs)
if action is not None:
# La fonction à exécuter
self.action = action
# Et ses arguments
self.args = actionArgs
self.config(validate = 'key', validatecommand = (self.register(self._doaction), '%P'))
def _doaction(self, value):
"""Cette methode wrap la fonction à exécuter et doit retourner False ou True pour être en accord avec validatecommand"""
return self.action(value, self.args)
if __name__ == '__main__':
root = Tk()
f = LabelFrame(root, text = 'hello')
f.grid()
e1 = ComboEntry(f, action = test)
e1.grid()
e2 = ComboEntry(f, action = test, actionArgs = ('toto','tutu'))
e2.grid()
e3 = ComboEntry(f, action = browse)
e3.grid()
root.mainloop() |
Merci beaucoup pour vos conseils
bon week-end
Eric