Précédent   Forum des professionnels en informatique > Autres langages > Python & Zope > EDI/RAD
EDI/RAD Environnements de développement pour Python
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/01/2012, 09h16   #1
Invité régulier
 
Vincent MAILLE
Inscription : avril 2010
Messages : 44
Détails du profil
Informations personnelles :
Nom : Vincent MAILLE

Informations forums :
Inscription : avril 2010
Messages : 44
Points : 8
Points : 8
Par défaut Evénement au clavier

Bonjour,

Est-il possible de transformer ces 3 lignes en une seule ( sans faire appel à Key bien entendu)

Code :
1
2
3
4
 
fenetre.bind_all('x', touche)
fenetre.bind_all('y', touche)
fenetre.bind_all('z', touche)
Merci,
Vincent
magicvinni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 12h26   #2
Membre habitué
 
Homme eric
Étudiant
Inscription : décembre 2010
Messages : 103
Détails du profil
Informations personnelles :
Nom : Homme eric

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2010
Messages : 103
Points : 100
Points : 100
Salut,

En deux :

Code :
1
2
3
4
5
6
7
 
for key in ['x','y','z']:
  fenetre.bind_all(key, touche)
 
ou 
for key in 'xyz':
  fenetre.bind_all(key, touche)
utopman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 13h11   #3
Invité régulier
 
Vincent MAILLE
Inscription : avril 2010
Messages : 44
Détails du profil
Informations personnelles :
Nom : Vincent MAILLE

Informations forums :
Inscription : avril 2010
Messages : 44
Points : 8
Points : 8
Merci, en effet, c'est une bonne idée. Je pensais qu'il existait une sorte d'expression rationnelle pour écrire ça dans la séquence mais en effet, je n'en avais pas trouvé.
Merci
magicvinni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 19h46   #4
Expert Confirmé
 
Homme Patrice
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 032
Détails du profil
Informations personnelles :
Nom : Homme Patrice
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Technicien Help Desk, maintenance, réseau, système et +
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2006
Messages : 2 032
Points : 2 600
Points : 2 600
Bonsoir,

Dans ce style ?

[fenetre.bind_all(key, touche) for key in 'xyz']
__________________
Merci d'utiliser le forum pour les questions techniques.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2012, 21h13   #5
Invité régulier
 
Vincent MAILLE
Inscription : avril 2010
Messages : 44
Détails du profil
Informations personnelles :
Nom : Vincent MAILLE

Informations forums :
Inscription : avril 2010
Messages : 44
Points : 8
Points : 8
Autre question du même type : mes élèves ont programmé une boule qui se déplace à l'écran à l'aide des flèches (avec Tkinter). Les plus rapides ont voulu en ajouter une autre pilotée avec A, Q, X, C pour le joueur 2, le soucis c'est que tkinter ne gère pas l'appuie sur des touches simultanées, ni même l'évènement "keyup" comme pygame, je voudrai rester pour cette année sur une solution tlkinter. On peut faire ça (facilement) ?

Merci,
Vincent
magicvinni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2012, 21h34   #6
Expert Confirmé
 
Homme Patrice
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 032
Détails du profil
Informations personnelles :
Nom : Homme Patrice
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Technicien Help Desk, maintenance, réseau, système et +
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2006
Messages : 2 032
Points : 2 600
Points : 2 600
Bonsoir,

Du simultané presque pas (Du fait de Tkinter et de Python) mais:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
try:
    import Tkinter as Tk
except:
    import tkinter as Tk
 
def onevent(event):
    print('pass')
 
root = Tk.Tk()
root.bind('<Up>'+'<a>', onevent)
root.bind('<Up>'+'<A>', onevent)
root.bind('<Up>', onevent)
root.bind('<A>', onevent)
root.bind('<a>', onevent)
root.mainloop()
Si le code est fluide cela devrais le faire.
A eux de voir les combinaisons possibles en fait.

Après c'est du plus lourd au niveau code.

@+
__________________
Merci d'utiliser le forum pour les questions techniques.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2012, 23h46   #7
Invité régulier
 
Vincent MAILLE
Inscription : avril 2010
Messages : 44
Détails du profil
Informations personnelles :
Nom : Vincent MAILLE

Informations forums :
Inscription : avril 2010
Messages : 44
Points : 8
Points : 8
J'avais essayé quelque chose comme ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
import random
try:
    import Tkinter as Tk
except:
    import tkinter as Tk
 
def J1Haut(e):
    print "J1 Haut",random.randint(1,100)
 
def J2Haut(e):
    print "J2 Haut",random.randint(1,100)
 
def J12Haut(event):
    print "J1 et J1 vers le  Haut",random.randint(1,100)
 
root = Tk.Tk()
root.bind('<Up>'+'<a>', J12Haut)
root.bind('<Up>'+'<A>', J12Haut)
root.bind('<Up>', J1Haut)
root.bind('<A>', J2Haut)
root.bind('<a>', J2Haut)
root.mainloop()
Mais ça ne fonctionne pas : si on laisse la touche du haut enfoncée, on voit que la fonction J1Haut se répète, si on appuie alors sur A, la fonction J12Haut s’exécute une seule fois, et ensuite, seule J2Haut. Enfin si on relâche que le A, il ne se passe plus rien, comme si la touche Haut n'était plus enfoncée.

Vincent
magicvinni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2012, 07h22   #8
Expert Confirmé
 
Homme Patrice
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 032
Détails du profil
Informations personnelles :
Nom : Homme Patrice
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Technicien Help Desk, maintenance, réseau, système et +
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2006
Messages : 2 032
Points : 2 600
Points : 2 600
Bonjour,

Il faudrait peut être ne pas trop se fier au print avec les répétitions de touches et spooler tout cela.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from Tkinter import *
 
activekey = {}
for k in ['e', 's', 'd', 'x', 'left', 'up', 'right', 'down']:
    activekey[k] = False
 
def pressed(event):
    key = event.keysym.lower()
    if key in activekey:
        activekey[key] = True
 
def released(event):
    key = event.keysym.lower()
    if key in activekey:
        activekey[key] = False
 
def animation():
    c1 = canvas.coords(player1)
    c2 = canvas.coords(player2)
    if activekey['e']:
        canvas.coords(player1, (c1[0], c1[1]-2, c1[2], c1[3]-2))
    if activekey['s']:
        canvas.coords(player1, (c1[0]-2, c1[1], c1[2]-2, c1[3]))
    if activekey['d']:
        canvas.coords(player1, (c1[0]+2, c1[1], c1[2]+2, c1[3]))
    if activekey['x']:
        canvas.coords(player1, (c1[0], c1[1]+2, c1[2], c1[3]+2))
    if activekey['up']:
        canvas.coords(player2, (c2[0], c2[1]-2, c2[2], c2[3]-2))
    if activekey['left']:
        canvas.coords(player2, (c2[0]-2, c2[1], c2[2]-2, c2[3]))
    if activekey['right']:
        canvas.coords(player2, (c2[0]+2, c2[1], c2[2]+2, c2[3]))
    if activekey['down']:
        canvas.coords(player2, (c2[0], c2[1]+2, c2[2], c2[3]+2))
    root.after(10, animation)
 
root = Tk()
canvas = Canvas(width=500, height=500)
canvas.pack()
player1 = canvas.create_oval(20, 20, 70, 70, width=2, fill='blue')
player2 = canvas.create_oval(420, 420, 470, 470, width=2, fill='red')
root.bind("<KeyPress>", pressed)
root.bind("<KeyRelease>", released)
animation()
root.mainloop()
Ici la partie logique est indépendante de l'interface. Le code est sans doute a revoir mais c'est l'idée.

@+
__________________
Merci d'utiliser le forum pour les questions techniques.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2012, 08h38   #9
Invité régulier
 
Vincent MAILLE
Inscription : avril 2010
Messages : 44
Détails du profil
Informations personnelles :
Nom : Vincent MAILLE

Informations forums :
Inscription : avril 2010
Messages : 44
Points : 8
Points : 8
Super ! J'en connais qui vont être content la semaine prochaine ! Je me voyais parti pour recoder cela avec pygame, ce qui aurait été dommage, car je trouve que Tkinter est plus formateur en terme d'apprentissage informatique.

Merci beaucoup
magicvinni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2012, 09h50   #10
Expert Confirmé
 
Homme Patrice
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 032
Détails du profil
Informations personnelles :
Nom : Homme Patrice
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Technicien Help Desk, maintenance, réseau, système et +
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2006
Messages : 2 032
Points : 2 600
Points : 2 600
Puisque c'est pour du pédagogique il serait peut être bon de dissocier les calculs des méthodes:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
def animation():
    c1 = canvas.coords(player1)
    c2 = canvas.coords(player2)
    if activekey['e']:
        c1[1] -= 2
        c1[3] -= 2
    if activekey['s']:
        c1[0] -= 2
        c1[2] -= 2
    if activekey['d']:
        c1[0] += 2
        c1[2] += 2
    if activekey['x']:
        c1[1] += 2
        c1[3] += 2
    if activekey['up']:
        c2[1] -= 2
        c2[3] -= 2
    if activekey['left']:
        c2[0] -= 2
        c2[2] -= 2
    if activekey['right']:
        c2[0] += 2
        c2[2] += 2
    if activekey['down']:
        c2[1] += 2
        c2[3] += 2
    canvas.coords(player1, tuple(c1))
    canvas.coords(player2, tuple(c2))
    root.after(10, animation)
A vous de voir.
__________________
Merci d'utiliser le forum pour les questions techniques.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h55.


 
 
 
 
Partenaires

Hébergement Web