Partage
  • Partager sur Facebook
  • Partager sur Twitter

Bouger multiple turtle dans tkinter?

    5 avril 2024 à 9:53:19

    bonjour,
    Je suis dans une interface mixte turtle dans tkinter (S V P ne pas indiquer que l'un des deux suffit)
    Je veux lier des fonctions de mouvement qui servent à bouger une tortue turtle à des clic de flèches mais je ne connais pas la syntaxe en tkinter, et mes essaie ne marche pas.
    Le code ci-dessous affiche juste les différentes sous-fenêtres voulues mais je ne sais pas bouger ma tortue.

    import tkinter as tk
    import turtle
    
    
    
    #création des variables globales pour la création du plan (Niveau 1)
    
    class App():
     
        def __init__(self):
             
            # fenêtre principale (root)
            self.root = tk.Tk()
            self.root.title('Va chercher les objets de Merlin')
            self.root.geometry('480x480')
            
        
            #panneau annonces
            self.annonces = tk.Canvas(self.root, width = 480, height = 50)#on crée la zone
            texte_annonces = self.annonces.create_text(120,20 , text = 'texte_annonces_objet', font="Arial 11 ")# on y met du texte
            self.annonces.pack(side = 'top')
    
            #panneau inventaire (parent - root)
            self.inventaire= tk.Canvas(self.root, width = 190, height = 430)
            self.texte_inventaire =self.inventaire.create_text(80 ,20, text = 'liste_on', font = 'Arial 11')
            self.inventaire.pack(side = 'right')
            
            # screen (parent = root)
            self.zone_for_turtle = tk.Canvas(self.root, width=280 , height=430)# on crée la zone
            self.turtle_screen = turtle.TurtleScreen(self.zone_for_turtle)
            self.turtle_screen.bgcolor("white")# ça c'est juste pour savoir la syntaxe pour le bgcolor
            self.zone_for_turtle.bind('Left', self.deplacer_gauche)#à lier aux fonctions en dessous mais la liaison ne se fait pas 
            self.zone_for_turtle.bind('Right', self.deplacer_droite)
            self.zone_for_turtle.bind('Down', self.deplacer_bas)
            self.zone_for_turtle.bind('Up', self.deplacer_haut)
            self.zone_for_turtle.pack( side = 'left')
    
            
            # les tortues (parent = turtle_screen)       
            self.CASE = turtle.RawTurtle(self.turtle_screen)
            self.PLAYER = turtle.RawTurtle(self.turtle_screen)
            self.creer_plan()
    
            
        def tracer_case(self,abs, ord, code_col):#ça c'est ok
            pass
        
        def creer_plan(self):#c'est c'est ok
            pass
            
    #fonction que je veux liée à un clic de flèche
        def deplacer_bas(self, event): 
            pass
        def deplacer_haut(self):
                self.turtle.onkeypress(self.deplacer_haut, "Up")
        def deplacer_gauche(self):
            pass
        def deplacer_droite(self):
            pass
    
    if __name__ == '__main__':    
        app = App()
        app.root.mainloop()
        App.creer_plan()
    
    

    -
    Edité par FlorenceGelbgras1 5 avril 2024 à 9:54:03

    • Partager sur Facebook
    • Partager sur Twitter
      5 avril 2024 à 10:29:33

      Et vous avez écrit tout ça sans avoir ouvert une documentation sur tkinter ou avoir  eu la curiosité de trouver un exemple de bind avec la clef Left? On écrira '<Left>' et non 'Left'... mais pas sûr que cela vous avance beaucoup.

      -
      Edité par mps 5 avril 2024 à 11:22:34

      • Partager sur Facebook
      • Partager sur Twitter
        5 avril 2024 à 11:06:40

        je crois que les > et < ne passent pas bien (ils ne sont pas passé en tout cas) => 

        "<Left>"



        -
        Edité par umfred 5 avril 2024 à 11:07:26

        • Partager sur Facebook
        • Partager sur Twitter
          5 avril 2024 à 11:24:48

          et il y a une solution, est-ce que j'ai mis les éléments au mauvais endroit , ou ai-je mal structuré mes sous-fenêtres?Est-ce que les 'bind' appellent la bonne sous-fenêtre?est-ce que la méthode .bind est la bonne méthode à utiliser dans ce cas?(je vois qu'il y a une correction de syntaxe pour les arguments des flèches d'après ton com, donc c'est fait mais ça ne passe pas)

          Ici j'ai mis volontairement le panneau intventaire avant pour que je puisse voir qu'il s'affiche quand je teste des choses plus longues dans le panneau turtle même si techniquement en termes de lecture ce serait mieux de mettre l'inventaire qui est à droite après le panneau turtle.

          J'ai ouvert la documentation mais je n'ai pas tout compris et je n'ai pas trouvé de codes suffisamment proche du mien dans leur structure pour pouvoir m'en inspirer. J'ai trouvé des codes pour des boutons mais ici c'est dans le cadre d'un projet et je dois utiliser les flèches direcitonnelles du clavier d'après les consignes.

          -
          Edité par FlorenceGelbgras1 5 avril 2024 à 11:31:42

          • Partager sur Facebook
          • Partager sur Twitter
            5 avril 2024 à 13:11:01

            FlorenceGelbgras1 a écrit:

            est-ce que la méthode .bind est la bonne méthode à utiliser dans ce cas?(je vois qu'il y a une correction de syntaxe pour les arguments des flèches d'après ton com, donc c'est fait mais ça ne passe pas)

            Techniquement, les évènements associée aux caractères ne se déclenchant que pour le widget qui a le focus. Mais il n'est pas interdit (et même recommandé) de coder un petit exemple où on met en musique un canvas, bind,... on regarde ce qu'il se passe et on relit la documentation au cas où. Sans avoir une idée de comment cela fonctionne, structurer votre code est prématuré.
            • Partager sur Facebook
            • Partager sur Twitter
              5 avril 2024 à 13:25:38

              ben-là même pour la "zone_for_turtle" ça ne fonctionne pas ;) , et il n'y a pour l'instant que la tortue de cette zone qui est impactée par les fonctions, mais elle refuse de bouger. Qu'est-ce que je dois dire comme mot magique?

              import tkinter as tk
              import turtle
              
              
              class App():
               
                  def __init__(self):
                       
                      # fenêtre principale (root)
                      self.root = tk.Tk()
                      self.root.title('Va chercher les objets de Merlin')
                      self.root.geometry('480x480')
                      
                  
                      #panneau annonces
                      self.annonces = tk.Canvas(self.root, width = 480, height = 50)#on crée la zone
                      texte_annonces = self.annonces.create_text(120,20 , text = 'texte_annonces_objet', font="Arial 11 ")# on y met du texte
                      self.annonces.pack(side = 'top')
              
                      #panneau inventaire (parent - root)
                      self.inventaire= tk.Canvas(self.root, width = 190, height = 430)
                      self.texte_inventaire =self.inventaire.create_text(80 ,20, text = 'liste_on', font = 'Arial 11')
                      self.inventaire.pack(side = 'right')
                      
                      
                      # screen (parent = root)
                      self.zone_for_turtle = tk.Canvas(self.root, width=280 , height=430)# on crée la zone
                      self.turtle_screen = turtle.TurtleScreen(self.zone_for_turtle)
                      self.turtle_screen.bgcolor("white")# ça c'est juste pour savoir la syntaxe pour le bgcolor
                      self.zone_for_turtle.bind("<Left>", self.deplacer_gauche)#à lier aux fonctions en dessous mais la liaison ne se fait pas 
                      self.zone_for_turtle.bind("<Right>", self.deplacer_droite)
                      self.zone_for_turtle.bind("<Down>", self.deplacer_bas)
                      self.zone_for_turtle.bind("<Up>", self.deplacer_haut)
                      self.zone_for_turtle.pack( side = 'left')
              
                      # les tortues (parent = turtle_screen)       
                      self.CASE = turtle.RawTurtle(self.turtle_screen)
                      self.PLAYER = turtle.RawTurtle(self.turtle_screen)
              
                      
              
                      
                  def tracer_case(self,abs, ord, code_col):#ça c'est ok
                      pass
                  
                  def creer_plan(self):#c'est c'est ok
                      pass
                      
              #fonction que je veux liée à un clic de flèche
                  def deplacer_bas(self, event): 
                      self.PLAYER.goto(0,-100)
                  def deplacer_haut(self,event):
                      self.PLAYER.goto(0,+100)
                  def deplacer_gauche(self,event):
                      self.PLAYER.goto(-100,0)
                  def deplacer_droite(self,event):
                      self.PLAYER.goto(100,0)
              
              if __name__ == '__main__':    
                  app = App()
                  app.root.mainloop()
              



              -
              Edité par FlorenceGelbgras1 5 avril 2024 à 13:26:01

              • Partager sur Facebook
              • Partager sur Twitter
                5 avril 2024 à 14:36:59

                @FlorenceGelbgras1 Bonjour, je viens de sortir des spam votre dernier message, si cela arrive encore vous pouvez poster dans ce sujet Si votre message est considéré comme spam

                • Partager sur Facebook
                • Partager sur Twitter
                  5 avril 2024 à 16:49:29


                  FlorenceGelbgras1 a écrit:

                  Qu'est-ce que je dois dire comme mot magique?

                  C'est pas trop compliqué d'écrire:

                  from tkinter import Canvas
                  
                  w = Canvas()
                  w.bind('<Left>', lambda e: print(e.keysym))
                  w.pack()
                  
                  w.mainloop()
                  
                  
                  

                  Pour constater que Left ne s'affiche pas tant que le widget n'a pas le focus (qui se récupère via w.focus_set())

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Bouger multiple turtle dans tkinter?

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  • Editeur
                  • Markdown