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 :

Je narrive pa a récupérer une touch avec bind


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de stuffy
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 31

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 70
    Par défaut Je narrive pa a récupérer une touch avec bind
    bonjour je voudrais créer un programme qui augmente la valeur d'une variable "y" lorsque la touche up, et pressé et que sa valeur diminue lorsque la touche down et pressé. J'ai essayer de regarder la F.A.Q je ne comprend pas merci

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je t'ai fait un petit code très simplifié qui fait ce que tu souhaites:

    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
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import Tkinter
     
    # variable globale dont on va changer la valeur
    y=0
     
    class Application(Tkinter.Frame):
     
        def __init__(self, master=None):
            global y
            Tkinter.Frame.__init__(self, master)
     
            self.grid()
     
            # création du label qui affiche la valeur de y
            self.affichey=Tkinter.Label(self, background="yellow", text=y)
            self.affichey.grid(row=0,column=0, sticky="we", padx=3, pady=3)
     
            # création du bouton "up"
            self.ajoute=Tkinter.Button(self, text="Up", background="light blue", activebackground="red", command=self.ajoutey)
            self.ajoute.grid(row=1, column=0, sticky="we", padx=3, pady=3)
     
            # création du bouton "down"
            self.retranche=Tkinter.Button(self, text="Down", background="light blue", activebackground="red", command=self.retranchey)
            self.retranche.grid(row=2, column=0, sticky="we", padx=3, pady=3)
     
        # méthode qui va incrémenter y et va afficher son résultat
        def ajoutey(self):
            global y
            y += 1
            self.affichey.configure(text=y)
     
        # méthode qui va décrémenter y et va afficher son résultat
        def retranchey(self):
            global y
            y -= 1
            self.affichey.configure(text=y)
     
    if __name__ == "__main__":
        fen=Tkinter.Tk()
        fen.title("Mon programme")
        app=Application(fen)
        fen.mainloop()
    Tyrtamos

  3. #3
    Membre chevronné Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Par défaut Ton code est très bien
    Mais je crois que stuffy voulait que sa variable soit incrémentée ou décrémentée lorsqu'il appuie sur la touche up ou down, pas quand il appuie sur un bouton (j'avoue ca ne change pas grand chose sauf si c'est pour programmer un jeu par exemple..).
    Je propose de reprendre ton code mais au lieu de mettre les boutons, écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    affichey.bind('<Up>',ajoutey)
    affichey.bind('<Down>',retranchey)

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour KindPlayer,

    Tu as entièrement raison: j'avais compris "bouton" et pas "touche clavier".

    Ta correction est bonne, mais il faut utiliser bind_all, sinon, ça ne marche que pour les widgets qui ont le focus. Et comme le label ne l'aura pas... Cela donnera:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            self.bind_all('<Up>',self.ajoutey)
            self.bind_all('<Down>',self.retranchey)
    Voilà mon petit programme corrigé (j'ai laissé les boutons!):

    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
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import Tkinter
     
    # variable globale dont on va changer la valeur
    y=0
     
    class Application(Tkinter.Frame):
     
        def __init__(self, master=None):
            global y
            Tkinter.Frame.__init__(self, master)
     
            self.grid()
     
            # création du label qui affiche la valeur de y
            self.affichey=Tkinter.Label(self, background="yellow", text=y)
            self.affichey.grid(row=0,column=0, sticky="we", padx=3, pady=3)
     
            # création du bouton "up"
            self.ajoute=Tkinter.Button(self, text="Up", background="light blue", activebackground="red", command=self.ajoutey)
            self.ajoute.grid(row=1, column=0, sticky="we", padx=3, pady=3)
     
            # création du bouton "down"
            self.retranche=Tkinter.Button(self, text="Down", background="light blue", activebackground="red", command=self.retranchey)
            self.retranche.grid(row=2, column=0, sticky="we", padx=3, pady=3)
     
            # pour que les touches clavier Up et Down fasse la même chose que les boutons
            self.bind_all('<Up>',self.ajoutey)
            self.bind_all('<Down>',self.retranchey)
     
        # méthode qui va incrémenter y et va afficher son résultat
        def ajoutey(self, event=None):
            global y
            y += 1
            self.affichey.configure(text=y)
     
        # méthode qui va décrémenter y et va afficher son résultat
        def retranchey(self, event=None):
            global y
            y -= 1
            self.affichey.configure(text=y)
     
    if __name__ == "__main__":
        fen=Tkinter.Tk()
        fen.title("Mon programme")
        app=Application(fen)
        fen.mainloop()
    Tyrtamos

  5. #5
    Membre chevronné Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Par défaut Bonne précision
    je connaissais pas bind_all. Je remarque que j'avais aussi oublié les "self" (sont-ils nécessaires d'ailleurs puisqu'on est à l'interieur de la classe?).

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Les self sont nécessaires parce que ... si on les oublie, ça ne marche plus

    Si on essaye d'appeler ajoutey au lieu de self.ajoutey, Python cherche une fonction globale appelée "ajoutey" qu'il ne trouve pas. En fait, self représente l'adresse de l'instance de classe qui référence les objets qui en font partie.

    De même, self.bind_all() affecte la liaison bind à l'instance de la classe Application. Et c'est bien ce qu'on veut ici pour que ça marche quelque soit le widget qui a le focus.

    Enfin, si on veut s'adresser à la fenêtre, en étant à l'intérieur de la classe Application, on utilise self.master pour "remonter" dans l'arbre des objets graphiques. Par exemple: self.master.title("Mon programme").

Discussions similaires

  1. Récupérer une donnée avec MsgBox
    Par gentoo dans le forum Access
    Réponses: 5
    Dernier message: 29/01/2007, 16h19
  2. Gérer l'appui sur une touche avec Alt Gr
    Par Haywire dans le forum Delphi
    Réponses: 6
    Dernier message: 10/01/2007, 16h56
  3. [MySQL] Récupérer une valeur avec SELECT sensible à la casse
    Par nuphius dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/01/2007, 15h21
  4. Récupérer une valeur avec un textarea
    Par Viau dans le forum Langage
    Réponses: 6
    Dernier message: 14/02/2006, 17h09
  5. [Key.isDown] Controler une touche avec code ascii
    Par arnolem dans le forum Flash
    Réponses: 3
    Dernier message: 30/01/2006, 14h34

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