Problème de variable semble t-il [Débutant]

Signaler
Messages postés
15
Date d'inscription
lundi 10 mars 2003
Statut
Membre
Dernière intervention
5 janvier 2013
-
Messages postés
104
Date d'inscription
lundi 9 octobre 2006
Statut
Membre
Dernière intervention
13 décembre 2020
-
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()


Merci.

3 réponses

Messages postés
104
Date d'inscription
lundi 9 octobre 2006
Statut
Membre
Dernière intervention
13 décembre 2020
66
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

Cordialement
Messages postés
15
Date d'inscription
lundi 10 mars 2003
Statut
Membre
Dernière intervention
5 janvier 2013

J'ai remplacé par:
def tracer():
    global rayon
    rayon=int(ent_rayon.get())
    if rayon>0:
        cercle(100, 100, rayon)

ça fonctionne mieux, si 0 est entré OK, mais si le champ "ent_rayon" est vide alors:
  File "C:\Python27\Scripts\Cercle\cercle.py", line 13, in tracer
    rayon=int(ent_rayon.get())
ValueError: invalid literal for int() with base 10: ''


Comment vérifier qu'il n'est pas vide SVP?

Obélix
Messages postés
104
Date d'inscription
lundi 9 octobre 2006
Statut
Membre
Dernière intervention
13 décembre 2020
66
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