Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide Canvas

Sujet résolu
    15 septembre 2014 à 21:56:58

    Bonsoir les zéros,

    J ai un petit problème avec le Canvas j'aimerais crée plusieurs éléments a l'aide d'une boucle puis les supprimer ultérieurement.

    Voici mon code avec lequel j'arrive a créer plusieurs éléments  mais n'a en supprimer qu'un.

    from tkinter import *
    def create(event=None):
        global x,y,largeur,hauteur,padx,block1
        for i in range (0,3):
            i+=1
            block1=zone.create_rectangle(x,y,x+largeur,y+hauteur,fill="red")
            x+=largeur+padx
        i=0
    
    def delete(event=None):
        global x,y,largeur,hauteur,padx,block1,xt,yt,z
        zone.delete(block1)
    
    jeux=Tk()
    x=5
    y=5
    largeur=100
    hauteur=20
    padx=10
    
    zone = Canvas(jeux, width=1200, height=600, bg="black")
    zone.grid(row=0,column=0,pady=5,padx=5)
    
    jeux.bind("<Right>",delete)
    jeux.bind("<Left>",create)
    
    jeux.mainloop()

    En espérant qu'une solution existe.

    Merci.

    Et bonne soirée

    • Partager sur Facebook
    • Partager sur Twitter
      16 septembre 2014 à 9:50:36

      Salut,

      Pourquoi qu'un seul se supprime? Tout simplement parce que ce que tu supprime c'est block1. Or il n'y a que UN block1. Dans ta boucle create(), à chaque itération, ta référence block1 est à chaque fois remplacée. Et donc c'est le dernier rectangle qui s'appelle block1. Pour corriger cela, tu peux enregistrer tes rectangles dans une liste:

      #Liste qui va contenir tes rectangles
      liste_rect = list()
      
      #Fonction qui créée les rectangles
      def create(event=None):
          global x
          for i in range (0,3):
          liste_rect.append(zone.create_rectangle(x,y,x+largeur,y+hauteur,fill="red"))
              x+=largeur+padx
      
      #Suppression du dernier rectangle
      def delete(event):
          rect_suppr = liste_rect.pop()
          zone.delete(rect_suppr)
      

      Attention: la fonction delete() supprimera le dernier rectangle créé.

      PS: Sinon pour ton code, il y a pas mal de petites erreurs. D'abord il n'y a aucune utilité à incrémenter la variable i dans ta fonction create(), puisque la boucle for le fait déjà. Ensuite, on utilise global pour les variables qui vont changer de valeurs. Pas pour celles qu'on va seulement utilisées. Ainsi, dans ta fonction create() seul x va modifier sa valeur au fur et à mesure (et liste_rect mais ce n'est pas la peine de le spécifier car c'est un objet mutable). Dernier point, pas besoin de mettre event=None en paramètre de ta fonction, event suffit.

      • Partager sur Facebook
      • Partager sur Twitter
      Précepte: Le mieux est l'ennemi du bien
        16 septembre 2014 à 16:11:35

        Si, le fait de mettre event=None permet d'appeler la fonction autrement que par binding tkinter. Sinon, quand tu appeles la fonction directement depuis le code, tu ne sais pas trop quoi faire de l'argument event...
        • Partager sur Facebook
        • Partager sur Twitter
          16 septembre 2014 à 18:29:54

          Ahhhhhh mais oui une liste ^^ 

          Je suis bete, je vois . Je suis un debutant j'ai pas encore le reflex ^^

          Merci Beaucoup 

          je vais arranger mon code avec le tien :)

          • Partager sur Facebook
          • Partager sur Twitter
            16 septembre 2014 à 18:53:49

            "Si, le fait de mettre event=None permet d'appeler la fonction autrement que par binding tkinter"

            J'y ai pensé justement :) et je trouve que l'idée est excellente (si elle fonctionne, j'ai pas testé). J'ai hésité à ne rien dire, mais je me suis dit que pour débuter, il vaut mieux clairement comprendre que event n'est utile que pour la méthode bind()

            Si c'est acquis, cette écriture est plus puissante que la mienne :p

            C'est ça qui est génial avec les forums, on apprend toujours quelque chose :lol:

            • Partager sur Facebook
            • Partager sur Twitter
            Précepte: Le mieux est l'ennemi du bien

            Aide 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