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):
merci de votre aide
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()
Partager