Salut à tous,
Grace à la courtoisie et la patience de plusieurs d'entre-vous ( certains se reconnaîtront) qui m'ont aidé par leurs exemples et conseils, j'ai poursuivi l'idée de construire une Entry numérique filtrée, bornée et mise en forme convenable.
J'aurais souhaité afficher un message à la place de la saisie quand les bornes sont dépassées: ('trop grand' ou 'trop petit').
Je rencontre un problème avec l'utilisation de sleep() ligne 111, il semble que cette fonction empêche la ligne 109 qui ne s'affiche plus sauf à inhiber sleep(3).
Il faut pourtant bien qu’après l'affichage du message d'erreur, j'efface ce message après un court laps de temps (ligne 113).
Les 'print()' témoins des lignes 112 et 114 ne s'affichent pourtant qu’après les 3 secondes demandées mais le message d'erreur ne s'affiche pas pendant cette pose.

root.after() idem ( essai lignes 116 à 121)

Je n'ai pas réussi. Si quelqu’un a un idée!

L.P.
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# -*- coding: utf-8 -*-
# Name:    MyEntryNum_00.py
# Created:     14/07/2017
#-------------------------------------------------------------------------------
 
from tkinter import *
from time import*
 
class MyEntryNum(Entry):
    """ Cette classe Entry surchargée doit permettre de controler les saisies numeriques
        entieres ou decimales bornees ou non avec une valeur par defaut ou non.
            Les arguments  a renseigner sont:
        typ= 0, defaut= '', maxi= None, mini= None, root= None
        (typ= 0 pour entier ou typ= 1 pour decimal)
            Exemple de creation d'une MyEntryNum:
       e1 = MyEntryNum(root= fen, defaut= 10, maxi= 100, mini= 10)
    """
    def __init__(self, typ= 1 , defaut= '', maxi= None, mini= None, root= None):
        self.maxi= maxi # ; print('maxi:=', self.maxi) ##
        self.mini= mini # ; print('mini:=', self.mini) ##
        self.defaut= defaut # ; print('defaut:=', self.defaut) ##
        self.root= root
        self.typ= typ # ; print('type',typ) ## Entier ou Decimal
        self.strVar = StringVar()
        self.strVar.set(self.defaut)
        self.strVar.trace("w", self.validation)
 
        Entry.__init__(self, textvariable= self.strVar, justify= 'right',
              bg='grey', validate= 'key', vcmd= self.verifsaisieKey)
        self.bind('<FocusOut>', self.verifMini)
        self.bind('<Key>', self.saisieKey)
 
    def verifMini(self, event):
        self.strVar.set(self.get().rstrip('.')) #°°°°°°°°°
        self.strVar.set(self.get().rstrip('-')) #°°°°°°°°°
        if self.get()=='' and self.mini != None and self.defaut != None:
            self.strVar.set(self.defaut)
 
        if self.mini != None and self.get() != '':
           if eval(self.get())< self.mini:
              self.strVar.set(self.defaut)
              self.config(bg='red')
              self.root.event_generate('<Shift-Tab>')
 
    def saisieKey(self, event):
        self.config(bg= 'grey')
        self.touche= event
        self.configure(validate= 'key', vcmd= self.verifsaisieKey)
 
    def verifsaisieKey(self):
        try: self.touche
        except: return True
 
 # cas decimal + ou -
        if self.typ==1 and self.touche.char in '0123456789.-' \
        or self.touche.keysym == 'BackSpace':
           return True
 
 # cas decimal +
        if self.typ==1 and self.touche.char in '0123456789.' \
        and self.mini> 0 or self.touche.keysym == 'BackSpace':
            return True
 # cas entier + ou -
        elif self.typ==0 and self.touche.char in '0123456789-' \
        and (self.mini==None or self.mini<= 0) or self.touche.keysym == 'BackSpace':
             return True
 # cas entier +
        elif self.typ==0 and self.touche.char in '0123456789' \
        and self.mini>= 0 or self.touche.keysym == 'BackSpace':
             return True
        else:
            self.bell()
            return False
 
    def validation(self,*args ):
 # cas du zero en debut si non dec : efface -> pas 0123 mais 123
        if len(self.get())>1 and self.get()[0]=='0' and self.get()[1] !='.':
            self.strVar.set(self.get().lstrip('0'))
 # cas du point en debut : ajoute 0. -> pas .123 mais 0.123
        if len(self.get())>0 and self.get()[0]=='.':
            self.event_generate('<BackSpace>')
            self.insert(0,'0.')
 # cas du zero en debut nb. ent. neg. : efface -> pas -.123 mais -0.123
        if len(self.get())==3 and self.get()[0]=='-' \
        and self.get()[1]=='0' and self.get()[2] !='.':
            self.event_generate('<BackSpace>')
            self.event_generate('<BackSpace>')
 # cas du zero en debut nb. dec. neg. : ajoute 0. -> pas .123 mais 0.123
        if len(self.get())==2 and self.get()[0]=='-' \
        and self.get()[1]=='.':
            self.event_generate('<BackSpace>')
            self.insert(1,'0.')
 # cas du - pas en debut : efface si le signe n'est en pos[0]
        if self.get().endswith('-') and len(self.get())>1:
            self.event_generate('<BackSpace>')
 # cas du . unique : efface si il y a + de 1 .
        if len(self.get())>1 and self.get().count('.')>1:
           self.event_generate('<BackSpace>')
 # cas du - unique : efface si il y a + de 1 -
        if len(self.get())>1 and self.get().count('-')>1:
           self.event_generate('<BackSpace>')
 # cas du maxi
        if len(self.get())>0 and self.maxi != None:
            if self.get()[0] not in '.-':
                if float(self.strVar.get())> self.maxi:
                    print('ligne 106')
                    self.delete(0,END)
                    print('ligne 108')
                    self.config(bg='red') ; self.insert(INSERT,'Trop Grand')
                    print('ligne 110')
                    sleep(3) #;
                    print('ligne 112')
                    self.delete(0,END)
                    print('ligne 114')
 
##                    self.root.after(2000, self.effMessage(self))
##                    self.bind('<FocusOut>', self.effMessage)
##
##    def effMessage(self, event):
##        print('efface')
##        self.delete(0,END)
 
#------- if main pour les essais -------------------
 
if __name__ == "__main__":
    fen = Tk()
    fen.geometry ("350x280+850+50")
    fen.title("      MyEntryNum  Exemple")
    def tabul(e):
        fen.event_generate("<Tab>")
        add(e)
 
    def add(e):
        """"""
        r1 = eval(e1.get()) if e1.get()!= '' else 0
        r2 = eval(e2.get()) if e2.get()!= '' else 0
        r3 = eval(e3.get()) if e3.get()!= '' else 0
        r4 = eval(e4.get()) if e4.get()!= '' else 0
        r5 = eval(e5.get()) if e5.get()!= '' else 0
 
        t= str(r1 + r2 + r3 + r4 + r5) ; l1.config(text=t)
 
    e1 = MyEntryNum(root= fen, typ= 1)
    e1.place(x= 50, y= 10,width= 60)
    e2 = MyEntryNum(root= fen, typ= 1, mini= -5, maxi= 5, defaut= 1)
    e2.place(x= 50, y= 40, width= 60)
    e3 = MyEntryNum(root= fen, typ= 0)
    e3.place(x= 50, y= 70, width =60)
    e4 = MyEntryNum(root =fen, typ= 0, mini= -10, maxi= 20)
    e4.place(x= 50, y= 100,width= 60)
    e5 = MyEntryNum(root= fen, typ= 0, mini= 10, maxi= 20)
    e5.place(x= 50, y= 130, width= 60)
 
    e1.focus_set()
    e1.select_range(0,END)
    fen.bind('<Return>', tabul)
    fen.bind('<Tab>', add)
    fen.bind('<1>', add)
    fen.bind('<FocusOut>', add)
 
    l1 = Label(fen, bg='light grey', width=20)
    l1.place(x=80,y=200,width=100)
 
    l_1 = Label(fen, text='e1 typ '+str(e1.typ))
    l_1.place(x=5,y=10,width=40)
    l_11 = Label(fen, text='min: '+str(e1.mini)+'  max: '+str(e1.maxi)+'  defaut: '+str(e1.defaut))
    l_11.place(x=110,y=10,width=200)
    l_2 = Label(fen, text='e2 typ '+str(e2.typ))
    l_2.place(x=5,y=40,width=40)
    l_12 = Label(fen, text='min: '+str(e2.mini)+'  max: '+str(e2.maxi)+'  defaut: '+str(e2.defaut))
    l_12.place(x=110,y=40,width=200)
    l_3 = Label(fen, text='e3 typ '+str(e3.typ))
    l_3.place(x=5,y=70,width=40)
    l_13 = Label(fen, text='min: '+str(e3.mini)+'  max: '+str(e3.maxi)+'  defaut: '+str(e3.defaut))
    l_13.place(x=110,y=70,width=200)
 
    l_4 = Label(fen, text='e4 typ '+str(e4.typ))
    l_4.place(x=5,y=100,width=40)
    l_14 = Label(fen, text='min: '+str(e4.mini)+'  max: '+str(e4.maxi)+'  defaut: '+str(e4.defaut))
    l_14.place(x=110,y=100,width=200)
 
    l_5 = Label(fen, text='e5 typ '+str(e5.typ))
    l_5.place(x=5,y=130,width=40)
    l_15 = Label(fen, text='min: '+str(e5.mini)+'  max: '+str(e5.maxi)+'  defaut: '+str(e5.defaut))
    l_15.place(x=110,y=130,width=200)
 
    fen.mainloop()