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.
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 </>).
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 ??
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 ?
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
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.
Blond, bouclé, toujours le sourire aux lèvres...
Blond, bouclé, toujours le sourire aux lèvres...
Découverte Python Doc Tkinter Les chaînes de caractères
Découverte Python Doc Tkinter Les chaînes de caractères