Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tkinter évènement simultanés

    6 mai 2018 à 18:51:22

    Bonjour,

    J'aimerais déplacer un carré a l'aide des touches directionnelles mais je voudrais pouvoir utiliser des touches simultanément par exemple haut + droite pour aller en diagonale.

    J'ai essayer de faire des "Up" + "Right" mais ça ne fonctionne pas.

    Merci d'avance pour l'aide

    Voici le code

    from tkinter import *
    
    def clavier(event):
    
        global coords
    
        touche = event.keysym
    
        if touche == "Up":
    
            coords = (coords[0], coords[1] - 10)
    
        elif touche == "Down":
    
            coords = (coords[0], coords[1] + 10)
    
        elif touche == "Right":
    
            coords = (coords[0] + 10, coords[1])
    
        elif touche == "Left":
    
            coords = (coords[0] -10, coords[1])
    
        canvas.coords(rectangle, coords[0], coords[1], coords[0]+25, coords[1]+25)
    
    fenetre = tkinter.Tk()
    
    canvas = Canvas(fenetre, width=250, height=250)
    
    coords = (0, 0)
    
    rectangle = canvas.create_rectangle(0,0,25,25)
    
    canvas.focus_set()
    
    canvas.bind("<Key>", clavier)
    
    canvas.pack()
    
    fenetre.mainloop()



    -
    Edité par DanielLi 20 mai 2018 à 18:52:01

    • Partager sur Facebook
    • Partager sur Twitter
      6 mai 2018 à 20:48:36

      Tu n'as jamais deux évènements en même temps, ils sont forcément à la suite même si très proches, par contre tu peux savoir facilement si deux touches sont pressées en même temps parce qu'il y a un évènement qui est envoyé quand on relâche la touche, donc tu peux savoir quand deux touches sont appuyées en même temps en suivant ces deux évènements.

      EDIT : Poste le code avec les balises code sinon c'est pas lisible (bouton </>).

      -
      Edité par LoupSolitaire 6 mai 2018 à 20:49:01

      • Partager sur Facebook
      • Partager sur Twitter

      Blond, bouclé, toujours le sourire aux lèvres...

        20 mai 2018 à 18:54:14

        Merci, alors j'aimerais savoir si c'était possible d'écrire un code dans le genre: tant que touche haut appuyer : aller en haut, tant que touche droite appuyer : aller a droite ??
        • Partager sur Facebook
        • Partager sur Twitter
          20 mai 2018 à 19:47:04

          Oui bien entendu, même principe : quand la touche est pressée, on déplace, et on arrête quand elle est relâchée.
          • Partager sur Facebook
          • Partager sur Twitter

          Blond, bouclé, toujours le sourire aux lèvres...

            20 mai 2018 à 22:39:30

            Voici un code qui réalise le déplacement avec appui simultané :

            from tkinter import Tk, Canvas
            
            SIZE=400
            
            root = Tk()
            cnv = Canvas(root, width=SIZE, height=SIZE, bg="ivory")
            cnv.pack()
            cnv.focus_set()
            
            SIDE=30
            UNIT=5
            
            key_press={"Left":False, "Right":False, "Up":False, "Down":False}
            
            rect=cnv.create_rectangle(SIZE/2-SIDE/2, SIZE/2-SIDE/2, 
                                      SIZE/2+SIDE/2, SIZE/2+SIDE/2, 
                                      fill="black")
            
            def move(event):
                key= event.keysym    
                if key=="Up" or key_press["Up"]:
                    cnv.move(rect, 0, -UNIT)
                if key=="Right"  or key_press["Right"]:
                    cnv.move(rect, UNIT, 0)
                if key=="Down" or key_press["Down"]:
                    cnv.move(rect, 0, UNIT)
                if key=="Left"  or key_press["Left"]:
                    cnv.move(rect, -UNIT, 0)  
            
            def press(event):
                key_press[event.keysym]=True
                move(event)
                    
            def release(event):
                key_press[event.keysym]=False  
            
            for key in ["Up", "Left", "Right", "Down"]:
                cnv.bind('<KeyPress-%s>' %key, press)    
                cnv.bind('<KeyRelease-%s>' %key, release)    
            
            root.mainloop()
            



            • Partager sur Facebook
            • Partager sur Twitter
              22 mai 2018 à 17:24:50

              PascalOrtiz a écrit:

              Voici un code qui réalise le déplacement avec appui simultané :

              from tkinter import Tk, Canvas
              
              SIZE=400
              
              root = Tk()
              cnv = Canvas(root, width=SIZE, height=SIZE, bg="ivory")
              cnv.pack()
              cnv.focus_set()
              
              SIDE=30
              UNIT=5
              
              key_press={"Left":False, "Right":False, "Up":False, "Down":False}
              
              rect=cnv.create_rectangle(SIZE/2-SIDE/2, SIZE/2-SIDE/2, 
                                        SIZE/2+SIDE/2, SIZE/2+SIDE/2, 
                                        fill="black")
              
              def move(event):
                  key= event.keysym    
                  if key=="Up" or key_press["Up"]:
                      cnv.move(rect, 0, -UNIT)
                  if key=="Right"  or key_press["Right"]:
                      cnv.move(rect, UNIT, 0)
                  if key=="Down" or key_press["Down"]:
                      cnv.move(rect, 0, UNIT)
                  if key=="Left"  or key_press["Left"]:
                      cnv.move(rect, -UNIT, 0)  
              
              def press(event):
                  key_press[event.keysym]=True
                  move(event)
                      
              def release(event):
                  key_press[event.keysym]=False  
              
              for key in ["Up", "Left", "Right", "Down"]:
                  cnv.bind('<KeyPress-%s>' %key, press)    
                  cnv.bind('<KeyRelease-%s>' %key, release)    
              
              root.mainloop()
              

              Merci !!!

              C'est ce que je voulais mais il reste encore un problème, quand on passe d'une direction a une autre il y a un temps de latence, comment faire pour le réduire voir le supprimer pour rendre les déplacements encore plus fluide ?



              • Partager sur Facebook
              • Partager sur Twitter
                22 mai 2018 à 17:52:26

                Salut,

                Voici une petite variante qui supprime la latence aux changements de directions :

                from tkinter import Tk, Canvas
                 
                SIZE=400
                 
                root = Tk()
                cnv = Canvas(root, width=SIZE, height=SIZE, bg="ivory")
                cnv.pack()
                cnv.focus_set()
                 
                SIDE=30
                UNIT=5
                 
                key_press={"Left":False, "Right":False, "Up":False, "Down":False}
                 
                rect=cnv.create_rectangle(SIZE/2-SIDE/2, SIZE/2-SIDE/2,
                                          SIZE/2+SIDE/2, SIZE/2+SIDE/2,
                                          fill="black")
                 
                def move():
                    if key_press["Up"]:
                        cnv.move(rect, 0, -UNIT)
                    if key_press["Right"]:
                        cnv.move(rect, UNIT, 0)
                    if key_press["Down"]:
                        cnv.move(rect, 0, UNIT)
                    if key_press["Left"]:
                        cnv.move(rect, -UNIT, 0)
                    root.after(30, move)
                 
                def press(event):
                    key_press[event.keysym]=True
                         
                def release(event):
                    key_press[event.keysym]=False 
                 
                for key in ["Up", "Left", "Right", "Down"]:
                    cnv.bind('<KeyPress-%s>' %key, press)   
                    cnv.bind('<KeyRelease-%s>' %key, release)
                
                move()
                 
                root.mainloop()
                



                • Partager sur Facebook
                • Partager sur Twitter
                  22 mai 2018 à 20:37:35

                  Ça marche parfaitement, merci infiniment ! 

                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 mai 2018 à 21:01:49


                    __Nicolas__ a écrit:

                    Voici une petite variante qui supprime la latence aux changements de directions :

                    Oui, c'est plus simple et et plus fluide, merci de cet amélioration.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 mai 2018 à 22:54:45

                      Désolé pour le dérangement, comment est ce que je pourrais faire si je voudrais que lorsque l'on relâche la touche, le déplacement s’effectue encore pendant 0.5 secondes ?

                      En gros pouvoir affecter des événements différents aux relâchements des touches

                       J'ai essayer mais c'est assez brouillon:

                      from tkinter import Tk, Canvas
                        
                      SIZE=400
                        
                      root = Tk()
                      cnv = Canvas(root, width=SIZE, height=SIZE, bg="ivory")
                      cnv.pack()
                      cnv.focus_set()
                        
                      SIDE=30
                      UNIT=3
                      slow=0
                        
                      key_press={"Left":False, "Right":False, "Up":False, "Down":False}
                        
                      rect=cnv.create_rectangle(SIZE/2-SIDE/2, SIZE/2-SIDE/2,
                                                SIZE/2+SIDE/2, SIZE/2+SIDE/2,
                                                fill="black")
                        
                      def move():
                          global slow
                          if key_press["Up"]:
                              cnv.move(rect, 0, -UNIT)
                              slow=3
                              
                          if key_press["Up"]==False:
                              cnv.move(rect, 0,-slow)
                              if slow>0:
                                  slow-=0.1
                              
                              
                          if key_press["Right"]:
                              cnv.move(rect, UNIT, 0)
                              slow=3
                              
                          if key_press["Right"]==False:
                              cnv.move(rect, slow, 0)
                              if slow>0:
                                  slow-=0.1
                                  
                                  
                          if key_press["Down"]:
                              cnv.move(rect, 0, UNIT)
                              slow=3
                              
                          if key_press["Down"]==False:
                              
                              cnv.move(rect, 0,slow)
                              if slow>0:
                                  slow-=0.1
                                  
                                  
                          if key_press["Left"]:
                              cnv.move(rect, -UNIT, 0)
                              slow=3
                          
                          if key_press["Left"]==False:
                              cnv.move(rect, -slow,0)
                              if slow>0:
                                  slow-=0.1
                          
                          root.after(30, move)
                        
                      def press(event):
                          key_press[event.keysym]=True
                                
                      def release(event):
                          key_press[event.keysym]=False
                        
                      for key in ["Up", "Left", "Right", "Down"]:
                          cnv.bind('<KeyPress-%s>' %key, press)  
                          cnv.bind('<KeyRelease-%s>' %key, release)
                       
                      move()
                        
                      root.mainloop()

                      Le code ne fonctionne pas bien pourquoi ??

                      ------------------ EDIT ------------------

                      J'ai réussi a contourner le problème, il suffisait de créer une variable différente pour chaque touche:

                      from tkinter import Tk, Canvas
                        
                      SIZE=400
                        
                      root = Tk()
                      cnv = Canvas(root, width=SIZE, height=SIZE, bg="ivory")
                      cnv.pack()
                      cnv.focus_set()
                        
                      SIDE=30
                      UNIT=3 #vitesse
                      up=0
                      right=0
                      down=0
                      left=0
                      slow=2 #valeur du ralentissement
                        
                      key_press={"Left":False, "Right":False, "Up":False, "Down":False}
                        
                      rect=cnv.create_rectangle(SIZE/2-SIDE/2, SIZE/2-SIDE/2,
                                                SIZE/2+SIDE/2, SIZE/2+SIDE/2,
                                                fill="black")
                        
                      def move():
                          global up
                          global right
                          global down
                          global left
                          
                          if key_press["Up"]:
                              cnv.move(rect, 0, -UNIT)
                              up=slow
                              
                          elif key_press["Up"]==False:
                              cnv.move(rect, 0,-up)
                              if up>0:
                                  up-=0.1
                              
                              
                          if key_press["Right"]:
                              cnv.move(rect, UNIT, 0)
                              right=slow
                              
                          elif key_press["Right"]==False:
                              cnv.move(rect, right, 0)
                              if right>0:
                                  right-=0.1
                                  
                                  
                          if key_press["Down"]:
                              cnv.move(rect, 0, UNIT)
                              down=slow
                              
                          elif key_press["Down"]==False:
                              
                              cnv.move(rect, 0,down)
                              if down>0:
                                  down-=0.1
                                  
                                  
                          if key_press["Left"]:
                              cnv.move(rect, -UNIT, 0)
                              left=slow
                          
                          elif key_press["Left"]==False:
                              cnv.move(rect, -left,0)
                              if left>0:
                                  left-=0.1
                          
                          root.after(30, move)
                        
                      def press(event):
                          key_press[event.keysym]=True
                                
                      def release(event):
                          key_press[event.keysym]=False
                        
                      for key in ["Up", "Left", "Right", "Down"]:
                          cnv.bind('<KeyPress-%s>' %key, press)  
                          cnv.bind('<KeyRelease-%s>' %key, release)
                       
                      move()
                        
                      root.mainloop()

                      Le résultat est satisfaisant, les elif sont ils mis aux bons endroits ?? n'y a t-il pas une meilleur façon d'avoir le même rendu ? 

                      -
                      Edité par DanielLi 23 mai 2018 à 0:06:15

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Tkinter évènement simultanés

                      × 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