clic et logique booléenne avec tkinter

clic et logique booléenne avec tkinter - Python - Programmation

Marsh Posté le 10-03-2014 à 15:40:09    

Bonjour,
 
En ce moment , j'utilise tkinter et je voudrais créer un rectangle en faisant create_rectangle(...,options) .Mais je bloque sur un exercice qui nous demande : que lors du premier clic , une fonction qui dessine le rectangle doit retourner un rectangle de couleur rouge, et lors du 2ème clic , un rectangle de couleur verte , ensuite au prochain clic , le rectangle rouge doit étre et aprés vert ....(et ainsi de suite ) .
J'ai pensé à la logigue booléenne , en initialisation une variable couleur , et l'incrémenter par la suite , en utilisant les conditions if , mais çà ne marche pas , je ne saisis pas le fonctionnement de tkinter et l'ampleur de l'argument event qui signifie évènement (pourtant , j'ai fait des heures de recherches)
 
Voilà mon bout de code , et petite précision (il y'a une fonction manager() qui regroupe la position du clic et la fonction dessiner() , mais le noyau dur  :pt1cable: c'est la fonction dessiner()) :
 

Code :
  1. >>> couleur = 0
  2. >>> def dessiner(event):
  3.      global couleur
  4.      if couleur is 0 : c.create_rectangle(x - d, y - d, x + d, y + d, fill='red', outline="" )
  5. ...          x, y = event.x, event.y
  6. ...          c = event.widget
  7. ...          d = 20             # diagonale
  8. ...          couleur = 1
  9.              if couleur is not 0 :c.create_rectangle(x - d, y - d, x + d, y + d, fill='green', outline="" )
  10.              x, y = event.x, event.y
  11.      c = event.widget
  12.      d = 20


 
En quoi mon raisonnement est faux ? J'ai un autre code concernant la parité en fonction d'un compteur des rectangles , mais c'est encore pire  
 
 
Une idée consisterait à retirer par le biais de l'index d'une genre le liste la couleur , en définissant à la base , un variable avec les deux couleurs :
 
COLORS = ('red', 'green')
 
def dessine(event):
    global couleur
    c.create_rectangle(x - d, y - d, x + d, y + d, fill=COLORS[couleur], outline="" )
 
Mais le shell dit que la variable couleur n'est pas définie , voilà le message que j'obtiens :
 
            Exception in Tkinter callback  
 
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1473, in __call__
    return self.func(*args)
  File "<stdin>", line 3, in manager
  File "<stdin>", line 6, in dessine
 
Pourtant , lorsque j'écris aprés que couleur = 0 ou couleur = 1 , j'obtiens un carré de couleur rouge et aprés verte(çà fonctionne comme les index des listes avec COLORS[couleur]) mais justement ce n'est pas juste puisque c'est le clic de la souris qui doit déclencher l'action et non mon écriture sur le shell  :fou: ...
 
 
_J'ai fait un autre test mais sans succés :
 

Code :
  1. >>> var = True
  2. >>> var
  3. True
  4. >>> var = not var
  5. >>> var
  6. False
  7. >>> var = not var
  8. >>> var
  9. True
  10. >>> def dessine(event) :
  11. ...     c = event.widget
  12. ...     d = 20
  13. ...     x, y = event.x, event.y
  14. ...     if green == True :c.create_rectangle(x - d, y - d, x + d, y + d, fill="green", outline="" )
  15. ...     else : c.create_rectangle(x - d, y - d, x + d, y + d, fill = 'red', outline="" )


 

Reply

Marsh Posté le 10-03-2014 à 15:40:09   

Reply

Marsh Posté le 10-03-2014 à 18:49:34    

1. L'indentation de ton code est toute foireuse, c'est incompréhensible
2. Le message d'erreur a pas l'air complet (il y a au moins une ligne qui manque)
3. dans le snippet 2, couleur n'est pas défini (global couleur ça définit rien du tout, ca dit juste que la fonction doit utiliser la variable globale en question, si elle n'existe pas ça va se vautrer)
4. dans le snippet 3, green n'est défini nulle part, je ne vois pas pourquoi ça fonctionnerait
5. avoir du code qui tourne c'est plus pratique pour tester/aider
6. itertools.cycle
7. utiliser code=python ça sort une meilleure coloration:

Code :
  1. def dessine(event) :
  2.    c = event.widget
  3.    d = 20
  4.    x, y = event.x, event.y
  5.    if green:
  6.        c.create_rectangle(x - d, y - d, x + d, y + d, fill="green", outline="" )
  7.    else:
  8.        c.create_rectangle(x - d, y - d, x + d, y + d, fill='red', outline="" )


Message édité par masklinn le 10-03-2014 à 19:07:45

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

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