Clic et logique booléen avec tkinter

giny28 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   -  
nidhogg-59 Messages postés 102 Date d'inscription   Statut Membre Dernière intervention   -
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 c'est la fonction dessiner()) :

>>> couleur = 0
>>> def dessiner(event):
      global couleur
      if couleur is 0 : c.create_rectangle(x - d, y - d, x + d, y + d, fill='red', outline="")
...          x, y = event.x, event.y
...          c = event.widget
...          d = 20             # diagonale
...          couleur = 1
             if couleur is not 0 :c.create_rectangle(x - d, y - d, x + d, y + d, fill='green', outline="")
             x, y = event.x, event.y
      c = event.widget
      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 que j'ai lu 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 ...


_J'ai fait un autre test mais sans succés :
>>> var = True
>>> var
True
>>> var = not var
>>> var
False
>>> var = not var
>>> var
True

>>> def dessine(event) :
...     c = event.widget
...     d = 20
...     x, y = event.x, event.y
...     if green == True :c.create_rectangle(x - d, y - d, x + d, y + d, fill="green", outline="")
...     else : c.create_rectangle(x - d, y - d, x + d, y + d, fill = 'red', outline="")

1 réponse

nidhogg-59 Messages postés 102 Date d'inscription   Statut Membre Dernière intervention   28
 
Bonjour!
Dans ton premier code, le second if est dans le premier if, donc je suppose que dans tous les cas, tu devais avoir un rect vert...
Et toujours dans le premier code, juste après avoir mis 'if couleur is not 0 :', tu aurais aussi du mettre 'couleur = 0'.
Aussi, certaines variables sont utilisées avant d'être crées.
En gros ça donnerais ça:
def dessiner(event):
      global couleur

      #d'abord on créé les variables x, y, c et d
      x, y = event.x, event.y     
      c = event.widget
      d = 20             # diagonale

      # puis on trace les rect.
      if couleur is 0: # Si couleur = 0 = rouge
             c.create_rectangle(x - d, y - d, x + d, y + d, fill='red', outline="")
             couleur = 1 # on change la couleur rouge->vert

      else:    # si c'est pas rouge, c'est obligatoirement vert...
             c.create_rectangle(x - d, y - d, x + d, y + d, fill='green', outline="")
             couleur = 0 # on change la couleur vert->rouge

Bon, j'ai pas testé... =\ Mais ça devrait le faire
Sinon, pour ce qui est des variables globales, il y mieux:
Voici deux codes équivalant (le second est plus 'propre' car on, utilise pas de variables globales)
a = 0
def new_a():
    global a
    a = 3

new_a()

a = 0
def new_a():
    a = 3
    return a

a = new_a()

Bon, pour les autres code:
le second, bah dans l'erreur ça parle de la ligne 6 de la fonction 'dessine' alors qu'il n' y a que 5 lignes, et puis bon... L'erreur donnée par Tk n'est pas vraiment compréhensible... (il manque pas un bout?)
Pour le dernier code, dans la forme il est bon, mais... Qu'est-ce qui cloche?
En fait ça serait mieux si tu disais ce qui n'allait pas car mis à part le changement de couleur inexistant, je ne vois pas d'erreur...

Sur ce, si t'as encore des erreurs, n'hésite pas, et n'oublie pas de préciser ce qui cloche/l'erreur donnée par python.
Bonne soirée/journée...
0