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 : Sélectionner tout - Visualiser dans une fenêtre à part
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