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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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