Salut à tous,
A propos des contrôles de saisie en sortie (focusout)

Je souhaiterais soumettre à vos avis éclairés le bout de code ci-aprés qui joue parfaitement son rôle mais il me parait un peu loin des canons du codage.

Le but est de factoriser le contrôle de plusieurs saisies en 'focusout'.
Ne sont acceptées que les saisies décimales >= 0.

L’idéal, (que je n'ai pas réussi à faire) serait de n'autoriser la sortie de l'Entry que si la saisie est conforme sans les allez-retours pour correction.

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
# -*- coding: UTF-8 -*-
# Nom:  validation_focusout_validate_1.0.py
#-------------------------------------------------------------------------------
from tkinter import *
 
def valid(ex): ## vérif de la saisie qui doit être >= 0
    try:
        if ex==1: ## verif de la saisie de Entry: E1
            val = float(varE1.get())
            if val < 0:
                invalid(ex)
        elif ex==2:
            val = float(varE2.get())
            if val < 0: ## verif de la saisie de Entry: E2
                invalid(ex)
    except ValueError:
        invalid(ex)
        return 0
    return 1
 
def sortie_e(event):
    fen.event_generate('<Tab>')
 
def invalid(ex):
    if ex==1:
        E1.focus_set() ## pour revenir sur la saisie incorecte dans E1
        E1.select_range(0,END) ## pour remplacer l'erreur
        fen.event_generate(0)  ## par un 0
        fen.event_generate('<Tab>')
    elif ex==2:
        E2.focus_set() ## pour revenir sur la saisie incorecte dans E2
        E2.select_range(0,END)
        fen.event_generate(0)
        fen.event_generate('<Tab>')
 
fen = Tk()
varE1 = StringVar() ; varE1.set(0)
varE2 = StringVar() ; varE2.set(0)
 
 
E1 = Entry(fen, textvariable = varE1, validate = 'focusout',
     validatecommand = lambda ex=1: valid(ex))
E1.grid(column=0,row=0,padx=5)
 
E2 = Entry(fen, textvariable = varE2, validate = 'focusout',
     validatecommand = lambda ex=2: valid(ex))
E2.grid(column=1,row=0,padx=5)
 
E1.focus_set()
 
E1.bind('<Return>', sortie_e)
E2.bind('<Return>', sortie_e)
 
fen.mainloop()