[Tkinter/Python] Bind et bindtags
frites.saucisse
-
frites.saucisse Messages postés 10 Statut Membre -
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.
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
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?