cs_asterixobelix
Messages postés15Date d'inscriptionlundi 10 mars 2003StatutMembreDernière intervention 5 janvier 2013
-
8 août 2011 à 11:17
lespinx
Messages postés106Date d'inscriptionlundi 9 octobre 2006StatutMembreDernière intervention23 novembre 2022
-
8 août 2011 à 21:38
Bonjour,
Je débute en python comme vous allez le voir avec ma question.
Je souhaite tracer un cercle dont le rayon est entré dans un champ "Entry".
J'obtiens avec le code ci-dessous le message suivant:
File "C:\Python27\Scripts\Cercle\cercle.py", line 13, in tracer
cercle(100, 100, rayon)
File "C:\Python27\Scripts\Cercle\cercle.py", line 9, in cercle
fen1.create_oval(x-r, y-r, x+r, y+r, outline=coul)
TypeError: unsupported operand type(s) for -: 'int' and 'instance'
Si je comprend un peu la variable "rayon" pose problème.
Il me manque un élément, ça fait une journée que je cherche!
Help me!
from Tkinter import *
from math import *
rayon=50
def cercle(x, y, r, coul ='black'):
"tracé d'un cercle de centre (x,y) et de rayon r"
fen1.create_oval(x-r, y-r, x+r, y+r, outline=coul)
def tracer():
global rayon
cercle(100, 100, rayon)
def effacer():
fen1.delete(ALL)
fenetre=Tk()
fenetre.title("Tracé d'un cercle")
rayon = Entry(fenetre)
rayon.grid(row=0,column=1,sticky =W)
#etiquette_rayon=Label(fenetre,text="Rayon")
#etiquette_rayon.grid(row=0,column=0,sticky =E)
etiquette_rayon=Label(fenetre,text=rayon)
etiquette_rayon.grid(row=0,column=0,sticky =E)
fen1=Canvas(fenetre,bg='white',height=200,width=200)
fen1.grid(rowspan=4, column=0,padx=0, pady=10)
bouton_tracer = Button(fenetre, text="Tracer",command=tracer)
bouton_tracer.grid(row=1, column=1,padx=0, pady=0)
bouton_effacer = Button(fenetre, text="Effacer",command=effacer)
bouton_effacer.grid(row=2, column=1,padx=0, pady=0)
bouton_quitter = Button(fenetre, text="Quitter",command=fenetre.destroy)
bouton_quitter.grid(row=3, column=1,padx=0, pady=0)
fenetre.mainloop()
lespinx
Messages postés106Date d'inscriptionlundi 9 octobre 2006StatutMembreDernière intervention23 novembre 202277 8 août 2011 à 15:29
Bonjour,
Duplication de variable
Ligne 4 ==> définition de la variable rayon=50
Ligne 20 ==> définition de l'objet TkInter (instance) rayon = Entry(fenetre)
Il faut changer le nom de la variable ou de l'objet TkInter
La ligne 23 est correcte, la ligne 26 est incorrecte
Lecture de la zone de saisie
Dans la fonction "tracer" il faut inclure le contrôle et la lecture de la zone de saisie:
==> rayon=int(ent_rayon.get())
Contrôle ==> s'assurer que rayon est numérique et supérieur à zéro
lespinx
Messages postés106Date d'inscriptionlundi 9 octobre 2006StatutMembreDernière intervention23 novembre 202277 8 août 2011 à 21:38
Si la zone de saisie est vide ou si elle contient des caractères non numérique, alors cela génère une exception au moment de la conversion vers le type Integer
Il est possible d'intercepter l'exception et de la gérer avec "try et except", on en profitera pour contrôler les bornes du rayon (par exemple : supérieur à zéro et inférieur à 100) :
def tracer():
try:
rayon=int(ent_rayon.get())
if rayon>0 and rayon<100:
cercle(100, 100, rayon)
else:
print "rayon hors limites"
return
except:
print "saisie non numerique"
return