Partage
  • Partager sur Facebook
  • Partager sur Twitter

[tkinter] event x,y dans une fenetre et un Canvas

Sujet résolu
    23 décembre 2016 à 20:20:15

    Bonjour/bonsoir,

    J'ai fais un petit programme  qui m'affiche, avec tkinter,  des cases (qui sont en fait des Canvas)  et je voudrais faire en sorte que quand je clique sur une case celle-ci disparaisse.

    from tkinter import *
    
    
    def clic(event):
        x=event.x
        y=event.y
        print("x={} y={}".format(x,y))
    
        if x < 50 and y < 50 :
            case00.destroy()
        elif (x>50 and x<100) and y < 50 :
            case01.destroy()
    
    
    fen = Tk()
    
    fen.geometry("500x500")
    fen.bind("<Button-1>",clic)
    
    case00= Canvas (fen, height=50, width = 50, bg ="grey")
    case00.place(x= 0,y=0)
    
    
    case01= Canvas (fen, height=50, width = 50, bg ="grey")
    case01.place(x= 50,y=0)
    
    fen.mainloop()

    Bon je n'ai mis que le début, mais la suite c'est la même chose (juste les coordonnées x et y qui change).

    Le problème c'est que quand je clique c'est toujours la case00 qui disparait car quand je clique sur une autre case (que la case00) , les coordonnées prisent en compte sont le coordonnées à l’intérieur du canvas sur lequel j'ai cliquer, les valeurs seront toujours entre 0 et 50, du coup c'est toujours la case00 qui disparait. (Je ne sais pas si c'est très claire ^^')

    Ce qui je voudrai savoir c'est :

    - Si c'est possible que quand je clique il ignore les canvas  et me donne les coordonnées du clique sur la grande fenêtre. 

    -Si c'est possible de savoir sur quel canvas je clique et que par conséquent  de faire un test pour supprimer la case correspondante.

    -Sinon si il y a d'autre solution pour faire ce que je voudrait faire

    Merci d'avance !

    -
    Edité par TheNoobyBoy 23 décembre 2016 à 20:22:54

    • Partager sur Facebook
    • Partager sur Twitter
      23 décembre 2016 à 23:14:13

      Bonsoir,

      Il existe une méthode plus simple si tes cases sont toutes de même dimensions ! 

      Si tes cases font toutes 50*50, alors tu peux récupérer la position de ton clic puis la diviser par 50, puis la convertir en entier.

      Alors tu pourras tracer un rectangle en fonction de ces coordonnées.

      Ensuite pour afficher/effacer, tu installe une matrice de dimension nombre de case en x/ nombre de case en y, puis tu ajoute 0 ou 1 en fonction du statut de ta case :

      from tkinter import*
      import numpy as np
       
      def clic(event):
          x, y = int(event.x/50), int(event.y/50)
          if matrice[y, x] == 0 :
              can.create_rectangle(x*50, y*50, x*50+50, y*50+50, width=0, fill='red')
              matrice[y, x] = 1
          else :
              can.create_rectangle(x*50,y*50, x*50+50, y*50+50, width=0, fill='white')
              matrice[y, x] = 0
       
      fen = Tk()
       
      can = Canvas(fen, width=1000, height=600, bg='white')
      can.bind('<Button-1>', clic)
      can.pack()
       
      matrice = np.zeros((int(1000/50), int(600/50)), dtype=int)
       
      fen.mainloop()
      
      
      matrice = np.zeros((int(1000/50), int(600/50)), dtype=int)
      
      fen.mainloop()

      -
      Edité par fabien69 23 décembre 2016 à 23:19:04

      • Partager sur Facebook
      • Partager sur Twitter
      fabien
        24 décembre 2016 à 0:10:45

        Déjà Merci pour ta réponse !

        Mais le probleme c'est que je suis débutant sur python et je  ne maitrise pas du tout numpy (je viens de l' installer pour tester ton code) et je ne maitrise pas non plus les matrice. ^^'

        Il n'y aurais pas un moyen de faire ça sans matrice ?

        Edit: En regardant ton code je viens d'avoir une idée (qui est enfaite la tienne) qui consiste à créer les case plutôt que de les détruire, sauf que je le ferais a ma façon (moins élégante surement ^^).

        Mais si quelqu'un peut répondre a la question originel du post je suis preneur aussi! :D :

        TheNoobyBoy a écrit:

        Ce qui je voudrai savoir c'est :

        - Si c'est possible que quand je clique il ignore les canvas  et me donne les coordonnées du clique sur la grande fenêtre. 

        -Si c'est possible de savoir sur quel canvas je clique et que par conséquent  de faire un test pour supprimer la case correspondante.

        -Sinon si il y a d'autre solution pour faire ce que je voudrait faire

        -
        Edité par TheNoobyBoy 24 décembre 2016 à 0:20:51

        • Partager sur Facebook
        • Partager sur Twitter

        [tkinter] event x,y dans une fenetre et un Canvas

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown