[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
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.
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.
A voir également:
- Tkinter bindtags
- Tkinter sqlite3 ✓ - Forum Python
- Tkinter focus_set ✓ - Forum Python
- Tkinter canvas rotate - Forum Python
- Tkinter rotate image - Forum Python
- Tkinter label image - Forum Python
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
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:
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
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?
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?