Lier un évenement sur un widget dans une classe à une fonction dans la classe parente
Bonjour,
Je ne sais même pas si l'intitulé est clair, débutant en python pas vraiment de base en poo, malgré mes recherches je n'arrive pas à transposer quelques lignes simples écrites moyennant une seule classe en un programme plus structuré qui fait appel à plusieurs classes. Mon problème est l'association d'un évènement <FocusOut> -par exemple- sur une des instances Entry à une fonction dans une classe parente.
Le code que je n'arrive pas à faire fonctionner, dans cette version là (parmi plusieurs) j'ai une erreur que je crois comprendre, mais comment faire? :(
Code:
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
|
from tkinter import *
# une fenêtre pour saisir une ligne comptable par exemple
class MonApp(Tk):
def __init__(self):
Tk.__init__(self)
self.title('MonApplication')
num1=Numericals(self)
# un frame regroupe les montants à saisir et/ou pré-calculés
class Numericals(Frame):
def __init__(self, parent):
Frame.__init__(self, parent=None)
self.pack(side=LEFT)
vHT=FieldFrame(self, "HT")
vTTC=FieldFrame(self, "TTC")
vTVA=FieldFrame(self, "TVA")
vHT.inField.bind("<FocusOut>", calc) #où/comment gérer le "bind"??
def calc(event): # exemple de pré-calcul
ht = vHT.getV()
ttc = 1.2*ht
tva=ttc-ht
vTTC.setV(ttc)
vTVA.setV(tva)
# petit' frame étiquette + le champ à remplir
class FieldFrame(Frame):
def __init__(self, parent, etikt, inV=0):
self.inV=StringVar()
Frame.__init__(self, parent)
self.pack(side=LEFT)
self.etikV = Label(self, text=etikt).pack()
self.inField = Entry(self, textvariable=self.inV).pack()
#self.inField.bind("<FocusOut>", calc)
def getV(self):
return inV.get()
def setV(self, inVal):
self.inV.set(inVal)
mApp = MonApp()
mApp.mainloop() |
Le code qui marche pour exprimer le fonctionnement attendu (dès que l'on quitte le champ HT les autres sont remplis avec une valeur par défaut, l'appui successif sur <TAB> par exemple permet de saisir rapidement lorsque les valeurs calculées par défaut s'avèrent correctes):
Code:
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
| from tkinter import *
# une fenêtre pour saisir une ligne comptable par exemple
class MonApp(Tk):
def __init__(self):
Tk.__init__(self)
self.title('MonApplication')
num1=Numericals(self)
# un frame regroupe les montants à saisir et/ou pré-calculés
class Numericals(Frame):
def __init__(self, parent):
Frame.__init__(self, parent=None)
self.pack(side=LEFT)
vHT=FieldFrame(self, "HT")
vTTC=FieldFrame(self, "TTC")
vTVA=FieldFrame(self, "TVA")
vHT.inField.bind("<FocusOut>", calc) #où/comment gérer le "binding"
def calc(event): # exemple de pré-calcul
ht = vHT.getV()
ttc = 1.2*ht
tva=ttc-ht
vTTC.setV(ttc)
vTVA.setV(tva)
# petit' frame étiquette + le champ à remplir
class FieldFrame(Frame):
def __init__(self, parent, etikt, inV=0):
self.inV=StringVar()
Frame.__init__(self, parent)
self.pack(side=LEFT)
self.etikV = Label(self, text=etikt).pack()
self.inField = Entry(self, textvariable=self.inV).pack()
#self.inField.bind("<FocusOut>", calc)
def getV(self):
return inV.get()
def setV(self, inVal):
self.inV.set(inVal)
mApp = MonApp()
mApp.mainloop() |
merci de votre aide