Forum EduPython

Echanges autour d'EduPython.

Vous n'êtes pas identifié(e).

#1 2018-08-15 22:04:40

atlass218
Membre
Inscription : 2018-08-06
Messages : 6

fonction pour l'erreur d'exception

J'ai crée une application à l'aide de " TKINTER " qui marche actuelle bien selon mes faibles connaissances puisque je suis débutant avec le langage PYTHON (version 3.5) sous Windows 10 64 bits.

Voici l'échantillon  du code de l'application qui  concerne les erreurs d'exception et qui me m’empêche à finaliser la version 1 de cette application que je souhaiterais la développer encore mieux au futur proche.


def message_erreur():
    if ent_labo_loc.get()==StringVar:
        lb_loc_exception['text']='Erreur, veuillez introduire seulement des chiffres'
        ent_labo_loc.set("")
    else:
        lb_loc_exception['text']=''
     
def afficher_resultat_loc():
 
    try :              
        calcul=20*log10(float(ent_labo_loc.get())/float(entree_ref_loc.get()))
        calcul=round(calcul,3)
        ent_correction_loc.set(calcul)
        ent_labo_loc.set("")
    except :                
        message_erreur()
    finally :
        pass

la fonction " afficher_resultat_loc() "  est attache au bouton de validation du calcul mathématique., dont voici le code:

#======= bouton de validation de la correction =====
 
bt_loc_validation=Button(loc,
                     text='Valider',
                     bd=14,             
                     relief=RIDGE,
                     font=('arial',16,'bold'),
                     justify='left',
                     command=afficher_resultat_loc)
bt_loc_validation.place(x=420,y=460)


#affichage d'un message en cas d'erreur exception
 
lb_loc_exception=Label(loc,text='',
                   fg='red',
                   font=('arial',18,'bold'),
                   justify='left',
                   bg='cadet blue'
                   )
 
lb_loc_exception.place(x=30,y=420)

le texte qui va être intégré dans ce label n'apparait que lorsque utilisateur écrit des caractères et doit   impérativement s'effacer quand l'utilise après introduit un nombre décimal

voici l'image de l'apparence de mon application en cas d'erreur:

180816082220535645.jpg

j’espère que j'ai bien détaillé mon problème

Merci pour l'aide

Dernière modification par atlass218 (2018-08-16 11:01:28)

Hors ligne

#2 2018-08-18 07:40:17

magicvinni
Administrateur
Inscription : 2017-12-22
Messages : 57

Re : fonction pour l'erreur d'exception

Bonjour,
Quelle est votre problème / question du coup ?

VM

Hors ligne

#3 2018-08-18 09:55:12

atlass218
Membre
Inscription : 2018-08-06
Messages : 6

Re : fonction pour l'erreur d'exception

Salut;

Je décrit à nouveau  mon problème de façon explicite : c'est que lorsque l'utilisateur écrit une chaine de caractère dans le widget "Entry" qui porte la consigne "introduire la valeur de la DDM lue par l'avion LABO". cela affiche le message d'alerte en rouge au dessous du widgte Entry (par exemple vous avez entre des cataractes et non pas des chiffres, veuillez introduire des nombres décimales). Ensuite une fois il entre un nombre décimal correct il s'affiche le résultat indique dans le bloc du try, et en même temps le message d'alerte doit être efface.

J’espère que mon problème a été bien décrit


180818124025745940.jpg

Merci pour l'aide

Dernière modification par atlass218 (2018-08-18 10:34:51)

Hors ligne

#4 2018-08-22 17:58:38

magicvinni
Administrateur
Inscription : 2017-12-22
Messages : 57

Re : fonction pour l'erreur d'exception

Bonsoir, le plus simple est de mettre un texte vide dans le label  :

lb_loc_exception.config(text="")

VM

Hors ligne

#5 2018-08-28 09:42:12

atlass218
Membre
Inscription : 2018-08-06
Messages : 6

Re : fonction pour l'erreur d'exception

bonjour
j'ai reformule la fonction d'ne autre facon mais toujours je rencontre des problème :

ent_labo_loc_35R=Entry(fen)
ent_ref_loc_35R=Entry(fen)
lb_loc_35R_exception=Label(fen,text="")

def afficher_resultat_loc_35R():
	
	try:							
		calcul_loc_35R=20*log10(float(ent_labo_loc_35R.get())/float(ent_ref_loc_35R.get()))
		calcul_loc_35R=round(calcul_loc_35R,3)
		ent_correction_loc_35R.set(calcul_loc_35R)
	except ValueError:
		for element in range(float(ent_labo_loc_35R.get()),float(ent_ref_loc_35R.get())):
			if elemet!=float():
				lb_loc_35R_exception.config(text='Erreur, veuillez introduire seulement des chiffres')
			else:
				lb_loc_35R_exception.config(text='')			
	finally:
		pass	

pourriez vous m'aide a corrige ce code

merci

Hors ligne

#6 2018-08-28 10:47:27

magicvinni
Administrateur
Inscription : 2017-12-22
Messages : 57

Re : fonction pour l'erreur d'exception

Bonjour, avec le try, vous ne voyez pas où se trouve les erreurs. par exemple le

for element in range(float(ent_labo_loc_35R.get()),float(ent_ref_loc_35R.get())):

Semble impossible, un range se fait sur des valeurs entières. Il y a un elemet au lieu de element .... Bref plein d'erreur que vous ne voyez pas à cause du try.

Je vous conseille quelque chose comme :

def afficher_resultat_loc_35R():
    OK = True
    try:		
        # on teste le calcul				
        calcul_loc_35R=20*log10(float(ent_labo_loc_35R.get())/float(ent_ref_loc_35R.get()))
     except : 
        OK = False
    if OK : 
        lb_loc_35R_exception.config(text='')			
        calcul_loc_35R=round(calcul_loc_35R,3)
        ent_correction_loc_35R.set(calcul_loc_35R)
        .....
    else : 
        lb_loc_35R_exception.config(text='Erreur, veuillez introduire seulement des chiffres')
....

En pratique, on sépare souvent la partie IHM (Interface Homme Machine) de la partie algo, une fonction pour tester que c'est une valeur décimale, une autre qui fait le "vrai" boulot

VM

Hors ligne

#7 2018-09-01 21:24:06

atlass218
Membre
Inscription : 2018-08-06
Messages : 6

Re : fonction pour l'erreur d'exception

bonsoir;
j'ai essaye le code ci-dessus mais ca n'a pas marche . pour cela, j'ai reformule la fonction (afficher_resultat_loc_35R) en introduisant une boucle pour qu'il y ait apparition de message d'erreur tant que les caractères introduit sont invalides

def afficher_resultat_loc_35R():

	while True:
		try:
		
			calcul_loc_35R=20*log10(float(ent_labo_loc_35R.get())/float(spin_ref_loc_35R.get()))
			calcul_loc_35R=round(calcul_loc_35R,3)
			ent_correction_loc_35R.set(calcul_loc_35R)
		
		except :
			lb_message_error=Label(canvas1_loc_35R,
			text='vous avez entre des caractères invalides').place(x=80,y=240)				
		
		else:
			break

mais une fois que met en action le script, j'ai remarque que l'application se plante comme si la boucle reste infini

merci pour l'aide

Hors ligne

#8 2018-09-02 16:13:23

magicvinni
Administrateur
Inscription : 2017-12-22
Messages : 57

Re : fonction pour l'erreur d'exception

Ben oui, le while True donne une boucle infinie... Quand on valide, il faut exécuter une fois le test. Je ne vois pas l’intérêt de la boucle.

Avec le while, on ne laisse pas le temps à Tkinter de rependre la main.

Hors ligne

#9 2018-09-03 09:50:28

atlass218
Membre
Inscription : 2018-08-06
Messages : 6

Re : fonction pour l'erreur d'exception

bonjour;
au lieu de la boucle,  j'ai fait une condition if :
voici un bout de code qui présente un défaut durant l’exécution de l'application

#textvariable pour Label (message d'erreur) loc 35R
message_error_loc_35R =StringVar()

#creation du label "message d'erreur"
lb_loc_35R_message=Label(canvas1_loc_35R,
						  bg='powder blue',
						  fg='red',
						  justify='left',
						  font=('arial',14,'bold'),
						  textvariable=message_error_loc_35R)
lb_loc_35R_message.place(x=10,y=120)


#pour afficher resultat du calcul ============= 	
def afficher_resultat_loc_35R():

	try:
		#ent_labo_loc_35R.get().replace(',','.')
		calcul_loc_35R=20*log10(float(ent_labo_loc_35R.get())/float(spin_ref_loc_35R.get()))
		calcul_loc_35R=round(calcul_loc_35R,2)
		ent_correction_loc_35R.set(calcul_loc_35R)
	except :
		if spin_ref_loc_35R.get()==0:
			message_error_loc_35R.set("vous avez entre un chiffre nul")			
		elif ent_labo_loc_35R.get()=="" or spin_ref_loc_35R.get()=="":
			message_error_loc_35R.set("vous avez laise un champs vide")
		elif ent_labo_loc_35R.get()==str() or spin_ref_loc_35R.get()==str():
			message_error_loc_35R.set("vous avez introduit des caracteres")

en testant l'application par : edit with IDLE, ensuite Run
pas d'affichage d'erreur syntaxique, mais l'aaplication ne marche pas convenablement comme je le souhaite

Dernière modification par atlass218 (2018-09-03 15:03:57)

Hors ligne

Pied de page des forums