Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème clic tkinter POO

Sujet résolu
    15 mai 2022 à 12:58:59

    h

    -
    Edité par LA Joya 16 mai 2022 à 18:11:37

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      15 mai 2022 à 14:49:28

      Salut !

      Peut-être ainsi :

      class Personnage:
          def __init__(self,can,img,nom):
              self.perso=can.create_image(50, 50,anchor=NW, image=img, tag=nom)
              self.can=can
              self.x = 0
              self.y = 0
       
          def clic(self,posX):
              x=self.x #utilité ?
              y=self.y #utilité ?
              self.can.coords(self.perso,posX,200)
              posX+=100



      -
      Edité par Anonyme 15 mai 2022 à 14:49:54

      • Partager sur Facebook
      • Partager sur Twitter
        15 mai 2022 à 16:16:28

        Je

        -
        Edité par LA Joya 16 mai 2022 à 18:12:04

        • Partager sur Facebook
        • Partager sur Twitter
          15 mai 2022 à 16:48:58

          Ligne 54; cnv.tag_bind("p1","",personnage1.clic(50)) la fonction est appelée immédiatement avec un seul paramètre alors qu'elle en attend 2.

          Après si la logique est:

          MoBo4 a écrit:

          je voudrais que dès que je clic sur un personnage celui-ci se déplace au centre et dès que je reclic dessus le personnage revient à sa position initiale

          Déjà il faut savoir si le personnage est au centre ou a sa position initiale pour passer de l'une à l'autre => 2 jeux de coordonnées et un indicateur pour savoir à quelle position le déplacer.

          Un truc comme çà:

          class Personnage:
              def __init__(self,can,img,nom):
                  self.positions = [ (50, 50), (100, 100) ]
                  self.au_centre = False
                  self.nom = nom
                  can.create_image(nom, self.positions[self.au_centre],
                                   anchor=NW, image=img, tag=nom)
                  self.can=can
           
              def clic(self, *event):
                  self.au_centre = not self.au_centre
                  self.can.coords(self.nom, self.positions[self.au_centre])

          devrait mieux marcher.

          • Partager sur Facebook
          • Partager sur Twitter
            15 mai 2022 à 17:00:17

            ça

            -
            Edité par LA Joya 16 mai 2022 à 18:12:17

            • Partager sur Facebook
            • Partager sur Twitter
              15 mai 2022 à 18:54:18

              MoBo4 a écrit:

              ça me met déplace tjr le perso dès que je lance le programme et non au clic, je pense il manque une méthode avec la valeur <Button-1> mais jsp c'est quoi le problème

              mps a écrit:

              Ligne 54; cnv.tag_bind("p1","",personnage1.clic(50)) la fonction est appelée immédiatement [...]

              • Partager sur Facebook
              • Partager sur Twitter
                15 mai 2022 à 19:29:00

                Ah

                -
                Edité par LA Joya 16 mai 2022 à 18:12:27

                • Partager sur Facebook
                • Partager sur Twitter
                  15 mai 2022 à 20:42:53

                  perso1=PhotoImage(file="personnage/p1.gif")
                  perso2=PhotoImage(file="personnage/p2.gif")
                  perso3=PhotoImage(file="personnage/p3.gif")
                  perso4=PhotoImage(file="personnage/p4.gif")
                  perso5=PhotoImage(file="personnage/p5.gif")
                  perso6=PhotoImage(file="personnage/p6.gif")
                  perso7=PhotoImage(file="personnage/p7.gif")
                  perso8=PhotoImage(file="personnage/p8.gif")

                  Il y a mieux à faire
                  persos = [PhotoImage(file=f"personnage/p{i}.gif") for i in range(1, 9)]
                  Si on veut faire de la POO, on prend tout le package et dans ce cas, la méthode clic n'exprime pas l'action du personnage, mais de l'utilisateur, on aurait pu s'imaginer une méthode nommée move_to_center_or_start_position avec une méthode move_to_center et move_to_start par exemple...
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                  La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                    15 mai 2022 à 20:59:32

                    et comment faire tout cela ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 mai 2022 à 21:11:31

                      comment ? En modélisant tes objets...

                      Un Canvas c'est un objet abstrait représentant un grand tableau noir, mais toi ce que tu veux c'est représenter une jungle, une ville, une cité, ... et là eh bien, on représente en code,

                      class Jungle(Canvas):
                          def __init__(self):
                              super().__init__(self)
                              self.output_pos_x = ...
                      
                          def add_personage(self, perso):
                              self.check_position(perso) # à implémenter
                              # suite
                      

                      bref je t'écrirai un roman... mais c'est ton histoire, et je ne sais pas comment tu déplaces tes persos, je ne sais pas de quelle manière ils avancent, ni ce qui se passe si ils sortent de la jungle... pour raconter son histoire, il faut avant tout là créer et être au clair avec acteurs, actions, ....

                      -
                      Edité par fred1599 15 mai 2022 à 21:12:27

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                        15 mai 2022 à 21:18:38

                        Déja

                        -
                        Edité par LA Joya 16 mai 2022 à 18:12:41

                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 mai 2022 à 21:29:21

                          Eh bien on t'as donné des solutions, faut les tester maintenant... La seule chose sur laquelle je reviens, c'est sur la manière dont tu veux créer ton application, c'est à dire en faisant de la POO. C'est une manière complexe, et difficile à appréhender pour le débutant... c'est pour cela que je te guide sur cette partie.

                          Maintenant, ça ne tiendrait qu'à moi, fait le tri dans ta tête, boit un café, dessine et représente. C'est pas compliqué pour beaucoup ici qui t'aident, mais ça demande un travail avec des pré-requis que tu n'as peut-être pas, et le fait de le faire à ta place t'avanceras pas plus à mon avis.

                          Et surtout ça se fait sans POO rapidement !

                          EDIT:

                          Petit exemple rapide,

                          from tkinter import (
                              Tk,
                              Canvas,
                          )
                          
                          CENTER = [317.5, 237.5, 322.5, 242.5]
                          
                          def click(event):
                              index = event.x//8
                              if 0 < index <= 7:
                                  item = canvas.itemcget(f"p{index+1}", "tag")
                              else:
                                  item = items_in_center.pop()
                              tag = item.split()[0]
                              coords = canvas.coords(tag)
                              if coords == CENTER:
                                  canvas.coords(tag, *coords_in_center.pop())
                              else:
                                  canvas.coords(tag, *CENTER)
                                  items_in_center.append(item)
                                  coords_in_center.append(coords)
                          
                          root = Tk()
                          canvas = Canvas(root, width=640, height=480)
                          canvas.pack()
                          
                          items_in_center = []
                          coords_in_center = []
                          
                          x = 1
                          for i in range(8):
                              tag = f"p{i+1}"
                              canvas.create_oval(x, 237.5, x+5, 242.5, fill="red", tags=tag)
                              canvas.tag_bind(tag, "<Button>", click)
                              x += 8
                          
                          root.mainloop()
                          

                          On peut sûrement encore l'améliorer mais à cette heure ci j'ai la flemme :)

                          -
                          Edité par fred1599 15 mai 2022 à 23:47:02

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                          problème clic tkinter POO

                          × 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