IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Aide pour associer événements clavier à l'aide d'un dictionnaire


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 27
    Par défaut Aide pour associer événements clavier à l'aide d'un dictionnaire
    Bonjour, je souhaites réaliser un jeu du serpent (sans prétention) et pour alléger mon code, je voudrais utiliser un dictionnaire pour les touches du clavier: left, right, up, down

    Ce n'est pas très explicite mais ça ressemblerait à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dx,dy = direction = {K_LEFT:(-1,0),K_RIGHT:(1,0),K_UP:(0,-1),K_DOWN:(0,1)}[event.get(KEYDOWN)[0].key]
    Le problème est que j'utilise tkinter et je ne sais pas comment adapter cette ligne dans mon code que voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    from tkinter import *
     
    class Application(Tk):
        ''
        def __init__(self):
            ''
            Tk.__init__(self)
     
            self.width, self.height = 400, 400
            self.flag = 0
            self.dx, self.dy = 1, 0
     
            self.can = Canvas(self, width= self.width, height= self.height, bg= 'blue')
            self.can.pack(side= TOP)
     
            Button(self, text= 'Start', command= self.start).pack(side= LEFT)
            Button(self, text= 'Stop', command= self.stop).pack(side= LEFT)
            Button(self, text= 'Quit', command= self.destroy).pack(side= LEFT)
     
            self.bind('<Left>', self.left)
            self.bind('<Right>', self.right)
            self.bind('<Up>', self.up)
            self.bind('<Down>', self.down)
     
            self.serpent()
     
        def start(self):
            ''
            if self.flag == 0:
                self.flag = 1
                self.move()
     
        def stop(self):
            ''
            self.flag = 0
     
        def left(self, event= None):
            ''
            if self.dx == 0:
                self.dx, self.dy = -1, 0
     
        def right(self, event= None):
            ''
            if self.dx == 0:
                self.dx, self.dy = 1, 0
     
        def up(self, event= None):
            ''
            if self.dy == 0:
                self.dx, self.dy= 0, -1
     
        def down(self, event= None):
            ''
            if self.dy == 0:
                self.dx, self.dy = 0, 1
     
        def serpent(self):
            ''
            x, y, self.cc = 20, 20, 10
            self.serp = []
     
            for t in range(4):
                carre = self.can.create_rectangle(x, y, x+self.cc, y+self.cc, fill= 'green')
                self.serp.append([carre, x, y])
                x += self.cc
     
        def move(self):
            ''
            # Référence du carré de queue:
            ref_cq = self.serp[0][0]
     
            # Coordonnées du carré de tête:
            xt, yt = self.serp[-1][1], self.serp[-1][2]
     
            # Coordonnées du nouveau carré de tête:
            self.xq, self.yq = xt+self.dx*self.cc, yt+self.dy*self.cc
     
            # Limites du canevas:
            if self.xq < 15 or self.xq > self.width-15 or self.yq < 15 or self.yq > self.height-15:
                self.flag = 0
     
            # Déplacement effectif du carré de queue en carré de tête:
            self.can.coords(ref_cq, self.xq, self.yq, self.xq+self.cc, self.yq+self.cc)
     
            # Mémorisation dans la liste de ce nouveau carré de tête:
            self.serp.append([ref_cq, self.xq, self.yq])
     
            # Retrait de la liste de l'ancien carré de queue:
            del(self.serp[0])
     
            if self.flag > 0:
                self.after(50, self.move)
     
     
    Application().mainloop()
    Je n'ai aucune idée de comment faire alors si quelqu'un à la gentillesse de m'expliquer je l'en remercie par avance.

    Bonne journée.

  2. #2
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    Salut,
    ce que j'en pense, c'est que tu pourrais mettre un méthode qui récupère les 4 bindings, effectue ta conversion avec le dictionnaire, puis appelle la méthode de déplacement correspondante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
        def get_event(self,event):
            self.dx,self.dy = self.direction = {K_LEFT:(-1,0),K_RIGHT:(1,0),K_UP:
    (0,-1),K_DOWN:(0,1)}[event.get(KEYDOWN)[0].key]
            func_to_call =  {(-1,0):self.left,(1,0):self.right,
    (0,-1):self.up,(0,1):self.down}[(self.dx,self.dy)]#Pour suivre ta lancée
            func_to_call(event)
    Et dans ton init tu as à peu près:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
            for key in ("<Up>","<Down>","<Left>","<Right>"):
                self.bind(key,self.get_event)
    Il se pourrait que les bindings se fassent sans les "K_".
    De plus, il faut creer (et stocker) ton dictionnaire hors de la méthode pour ne pas avoir à le reconstruire (et détruire) à chaque appel de cette dernière.

    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    bon, je ne connais pas tkinter mais en cherchant un peu dans la doc ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        def __init__(self):
             ....
             ....
            self.bind('<Left>', self.update)
            self.bind('<Right>', self.update)
            self.bind('<Up>', self.update)
            self.bind('<Down>', self.update)
     
            self.serpent()
     
        def update(self,ev):
           self.dx, self.dy = {'Left':(-1,0),'Right':(1,0), etc...}[ev.keysym]

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 27
    Par défaut
    Génial merci à vous deux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for key in ('<Left>', '<Right>', '<Up>', '<Down>'):
                self.bind(key, self.depl)
     
            self.serpent()
     
        def depl(self, event= None):
            ''
            self. dx, self.dy = {8060956:(-1,0), 8126493:(1,0), 8257566:(0,-1), 8192031:(0,1)}[event.keycode]
    Je vais essayer de créer le dictionnaire hors de la méthode et tester la solution que tu viens d'éditer josmiley.

    Encore merci.

    Edit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def depl(self, event= None):
            ''
            self.dx, self.dy = {'Left':(-1,0), 'Right':(1,0), 'Up':(0,-1), 'Down':(0,1)}[event.keysym]
     
            # Ou:
            # self.dx, self.dy = {8060956:(-1,0), 8126493:(1,0), 8257566:(0,-1), 8192031:(0,1)}[event.keycode]

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    le problème ici, je pense ... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.dx, self.dy = {8060956:(-1,0), 8126493:(1,0), 8257566:(0,-1), 8192031:(0,1)}[event.keycode]
    c'est que les keycodes peuvent être différents d'une bécane à l'autre car dépendant du clavier ... enfin, il me semble.

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 27
    Par défaut
    Et est-ce pareil avec keysym ?

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Citation Envoyé par Asimoov Voir le message
    Et est-ce pareil avec keysym ?
    ben justement non, la table keysym est construite en fonction du system, et non du matériel ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] besoin d aides pour association d aide a la vie
    Par yannick44 dans le forum Conception
    Réponses: 3
    Dernier message: 03/12/2011, 11h38
  2. Réponses: 0
    Dernier message: 04/06/2010, 12h18
  3. Besoin petite aide pour association
    Par ptityop dans le forum Autres
    Réponses: 0
    Dernier message: 09/10/2007, 16h23
  4. Aide pour script d'analyse d'évènements
    Par Spear- dans le forum VBScript
    Réponses: 7
    Dernier message: 18/10/2006, 11h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo