[Tkinter/Python] Bind et bindtags

Fermé
frites.saucisse - 3 avril 2008 à 15:32
frites.saucisse Messages postés 10 Date d'inscription mardi 1 avril 2008 Statut Membre Dernière intervention 16 octobre 2012 - 3 avril 2008 à 16:55
Bonjour,
J'ai un widget Entry qui a deux binds sur <FocusOut> avec des callbacks différents: l'un est au niveau de l'instance, l'autre au niveau de la classe. Je souhaiterais que le bind sur la classe se fasse avant celui sur l'instance. Par défaut, c'est l'inverse (cf manuel tkinter p 77, par exemple).
Je crois que la solution est d'utiliser un .bindtags(tagList="..."). J'ai essayé un truc comme ça
[CODE]self.en.bindtags(tagList=("Entry","<Return>","<FocusOut>"))[/CODE]
mais sans succès.
Quelqu'un peut-il m'aider?
Merci.

1 réponse

frites.saucisse Messages postés 10 Date d'inscription mardi 1 avril 2008 Statut Membre Dernière intervention 16 octobre 2012
3 avril 2008 à 16:55
Je vais essayer d'être plus précis dans la description de mon problème.

Initialement, j'ai un formulaire avec des champs à remplir. Des valeurs sont inscrites par défaut dans tous les champs (en l'occurrence des 0.0 ou des -). En utilisant le formulaire, je trouve pénible d'effacer chaque fois cette valeur par défaut. Alors j'ai créé une classe EntryZ dérivée d'une classe Entry qui efface la valeur dès qu'elle a le focus. Mais si le focus part et que la case est vide, alors j'y remets soit 0.0, soit -. En clair, ça donne ceci:

class EntryZ(Entry):
    def __init__(self,master,txt,wdth):

        self.master = master
        self.txt = txt
        self.wdth = wdth
        self.out = StringVar()
        self.tag = IntVar()
        self.out.set('a')
        self.tag.set(0)

        def callbackIn(out,tag):
            '''Supprime la valeur qu'il y a dans l'Entry'''
            self.out = out
            self.tag = tag
            if self.get() == '0.0' or self.get() == '-':
                self.out.set(self.get())
                self.delete(0,END)
                self.tag.set(1)
            else:
                pass

        def callbackOut(out,tag):
            '''Si l'entry est vide, on y remet ce qu'elle contenait auparavant'''
            self.out = out
            self.tag = tag
            if self.get() != '':
                pass
            elif self.tag.get() == 1:
                self.insert(0,self.out.get())
            else:
                pass

        Entry.__init__(self,self.master,textvariable=self.txt,width=self.wdth)
            
        self.bind("<FocusIn>", lambda event:callbackIn(self.out,self.tag))
        self.bind("<FocusOut>", lambda event:callbackOut(self.out,self.tag))


Ces valeurs entrées sont utilisées dans la classe principale pour faire un calcul. Le calcul est déclenché par un bind sur <Return> et <FocusOut>. Par exemple

        
self.en=EntryZ(self.champ2,self.dbl[0],15)
self.en.grid(row=1,column=1)
self.en.bind("<FocusOut>",lambda event:callbackFourn(self.stg[8].get(),self.stg[9].get(),self.stg[6])


L'ennui c'est que le bind sur FocusOut de la classe principale s'effectue avant celui dans la classe EntryZ. Par conséquent, la variable de la case qui a le focus est donc vide et ne peut pas être prise par .get(). J'ai alors un message d'erreur.

Comment faire en sorte que le bind de EntryZ se fasse avant celui de la classe principale?
0