[Tkinter/Python] Bind et bindtags

frites.saucisse -  
frites.saucisse Messages postés 10 Statut Membre -
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.
Configuration: Windows XP
Firefox 2.0.0.13

1 réponse

  1. frites.saucisse Messages postés 10 Statut Membre
     
    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