[Python] [Résolu] Variables globales

Variables globales [Python] [Résolu] - Python - Programmation

Marsh Posté le 10-01-2010 à 19:05:45    

Bonsoir,  
 
Me revoilà avec une nouvelle question. Comme je débute en Python, je risque d'en avoir souvent (patapay).
 
Lorsque je lance l'exécution du programme suivant, Python m'indique que y2 n'est pas définie. J'ai un peu de mal à faire la distinction entre variables locales et variables globales. Même chose avec les autres langages.
 
Quelqu'un pourrait-il m'aider à faire tourner mon* programme et m'expliquer simplement en quoi ces deux types de variables sont différents.
 
Je sais déjà que les variables locales sont définies à l'intérieur d'une fonction et les variables globales à l'extérieur, mais à part ça...
 
Le script :
 

Citation :

from Tkinter import *
from random import randrange
 
def drawline():
    "Tracé d'une ligne dans le canevas can1"
    global x1, y1, x2, y2, coul
    can1.create_line(x1, y1, x2, y2, width=2, fill=coul)
 
y2, y1 = y2+10, y1-10
 
def changecolor():
    "Changement aléatoire de la couleur du tracé"
    global coul
    pal=['purple', 'cyan', 'maroon', 'green', 'red', 'blue', 'orange', 'yellow', 'pink', 'silver']
    c = randrange(10)
    coul = pal[c]
 
x1, y1, x2, y2 = 10, 190, 190, 10          
coul = 'dark green'                          
 
fen1 = Tk()
can1 = Canvas(fen1, bg='dark grey', height=200, width=200)
can1.pack(side=LEFT)
bou1 = Button(fen1, text='Quitter', command=fen1.quit)
bou1.pack(side=BOTTOM)
bou2 = Button(fen1, text='Tracer une ligne', command=drawline)
bou2.pack()
bou3 = Button(fen1, text='Autre couleur', command=changecolor)
bou3.pack()
 
fen1.mainloop()                              
fen1.destroy()


 
* Programme récupéré en fait sur le Net
 
Merci d'avance.

Message cité 1 fois
Message édité par Profil supprimé le 26-01-2010 à 19:20:25
Reply

Marsh Posté le 10-01-2010 à 19:05:45   

Reply

Marsh Posté le 10-01-2010 à 22:18:05    

http://pragprog.com/titles/gwpy/practical-programming


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 10-01-2010 à 22:34:33    


J'ai pas spécialement envie de m'acheter un bouquin, surtout en anglais.

Reply

Marsh Posté le 10-01-2010 à 23:38:39    

Tu veux apprendre à programmer ou pas ?
Et si t'aimes pas l'anglais, arrêtes tout de suite, tu arriveras à pas grand chose...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 22-01-2010 à 21:05:58    


 
Bonsoir
 
J'arrive un peu en retard mais c'est parce que je viens plus trop souvent dans cette partie du forum.
 
Bon, tout d'abord parlons de ton programme. Tu remarqueras que la ligne 13, celle qui pose problème, est totalement hors contexte. Pourquoi remplir des valeurs qui seront écrasées par celles de la ligne 22 ?
Cette simple réflexion permet ensuite d'en déduire que la ligne 13 doit probablement appartenir à la fonction "drawline()" mais qu'il manque la tabulation qui l'indique. Sans cette dernière, l'interpréteur cherche à exécuter cette ligne avant l'appel à la fonction. Et alors la variable y2 n'est pas encore définie
Il te suffit juste de décaler cette ligne pour la mettre au même niveau que celle qui la précède. Evidemment si ce programme récupéré sur le net avait été un poil plus propre, la fin de fonction y serait indiquée et t'aurais trouvé l'erreur plus facilement
 
Voici un code qui fonctionne

Code :
  1. #!/usr/bin/env python
  2. # coding: Latin-1 -*-
  3.  
  4. from Tkinter import *
  5. from random import randrange
  6.  
  7. def drawline():
  8.    "Tracé d'une ligne dans le canevas can1"
  9.    global x1, y1, x2, y2, coul
  10.    can1.create_line(x1, y1, x2, y2, width=2, fill=coul)
  11.    y2, y1 = y2+10, y1-10
  12. # drawline()
  13.  
  14. def changecolor():
  15.    "Changement aléatoire de la couleur du tracé"
  16.    global coul
  17.    pal=['purple', 'cyan', 'maroon', 'green', 'red', 'blue', 'orange', 'yellow', 'pink', 'silver']
  18.    c = randrange(10)
  19.    coul = pal[c]
  20. # changecolor()
  21.  
  22. x1, y1, x2, y2 = 10, 190, 190, 10        
  23. coul = 'dark green'                        
  24.  
  25. fen1 = Tk()
  26. can1 = Canvas(fen1, bg='dark grey', height=200, width=200)
  27. can1.pack(side=LEFT)
  28. bou1 = Button(fen1, text='Quitter', command=fen1.quit)
  29. bou1.pack(side=BOTTOM)
  30. bou2 = Button(fen1, text='Tracer une ligne', command=drawline)
  31. bou2.pack()
  32. bou3 = Button(fen1, text='Autre couleur', command=changecolor)
  33. bou3.pack()
  34.  
  35. fen1.mainloop()                            
  36. fen1.destroy()


 
Maintenant les globales: ben une variable globale est, comme son nom l'indique, une variable qui est connue dans la globalité du programme. Maintenant, beaucoup de programmeurs préfèrent éviter de les utiliser car quand une variable globale part en torche, difficile de trouver à quel endroit elle s'est mise à déconner. Surtout que Python est assez riche de possibilités pour te permettre de ne pas en avoir besoin.


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 24-01-2010 à 21:06:11    

Sve@r > encore une erreur d'indentation. Cela dit, je commence à moins en faire. J'ai bien avancé dans l'apprentissage de ce langage et je commence à m'habituer à son extrême rigueur.
 
Je retiens l'idée d'indiquer la fin de la fonction [:bien]
 
Quant aux variables globales, j'essaierai de les utiliser le moins possible alors :D  
 
Merci d'avoir pris le temps de me répondre :jap:  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed