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

  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 492
    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 492
    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 492
    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 492
    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 492
    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 492
    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").

  7. #7
    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 Oui
    d'ailleurs j'ai dit une énormité. C'est bien parce que on est a l'interieur de la classe qu'on met des self, sinon ils n'auraient pas de sens. Des fois j'oublie de réfléchir.

  8. #8
    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 merci
    merci a tous vous m'avais bien aider et kindplayer a bien comprit ce que je voulais faire.

  9. #9
    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
    Voila avec tous vos code je me suis dit qu'il était un peu charger alors j'ai décidé de faire un peut de rangement je suppose que ma technique a de gros défaut mais je suis débutant et je les connait pas alors si vous pouviez me les indiqué ce serai gentil merci (trouvez vous pas que cela est moin chargé et plus lisible) .

    De plus je ne comprend pas pourquoi le bind_all est associé a la variable du Label et a quoi sert les arguments event=none et franchement je ne trouve pas que ce soit bon d'apprendre des chose sans les comprendre merci d'avance.


    code :

    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
     
     
     
    # -*- coding: Latin-1 -*-
     
    from Tkinter import*
     
    # ===> SCRIPT VISUEL <=== #
     
     
    # --- Etablissement de la variable --- #
     
    position = 0
     
     
    # --- Etablissement des fonctions --- #
     
    def augmenter(event=None):
        global position
        position = position + 1
        coord.configure(text = position)
     
     
    def diminuer(event=None):
        global position
        position = position - 1
        coord.configure(text = position)
     
     
    # ===> SCRIPT VISUEL <=== #
     
    fenetre = Tk()
     
    # --- Edition du label  --- #
     
    coord = Label(fenetre)
    coord.configure(text = position)
    coord.pack()
     
    # --- Récupération de l'appui des touches "up" et "down" --- #
     
    coord.bind_all('<Up>',augmenter)
    coord.bind_all('<Down>',diminuer)
     
    fenetre.mainloop()

  10. #10
    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
    bind_all c'est pour que l'évenement soit associé à toute l'application, et donc que ton label et ta variable soient mis à jour lorsque tu appuies sur la touche haut ou bas, même si c'est un autre widget qui a le focus. event=none signifie que ta méthode n'est associée à aucun evenement en particulier. C'est bien de simplifier le code mais je te conseille néanmoins de laisser ton appli enveloppée au sein d'une classe comme l'a fait tyrtamos.

  11. #11
    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
    D'accord a l'avenir j'encapsulerais l'appli dans une class mais une derniere question m'a question pour le bind_all était pourquoi il est associé a la variable "coord" et non pas a une nouvelle variable nommé par exemple "recupération"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    coord = Label(fenetre)
    coord.configure(text = position)
    coord.pack()
     
    # --- Récupération de l'appui des touches "up" et "down" --- #
     
    coord.bind_all('<Up>',augmenter)
    coord.bind_all('<Down>',diminuer)

  12. #12
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 492
    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 492
    Billets dans le blog
    6
    Par défaut
    Juste un petit mot concernant event=None.

    Cela fait partie de la programmation par évènement.

    Quand la fenêtre est affichée (on est dans fen.mainloop()), elle ne fait qu'une seule chose: elle attend qu'il se passe quelque chose: un évènement (une touche de clavier, un clic de souris, un signal réseau, etc...). Chaque évènement est traité par une méthode (=une fonction de la classe). Quand l'évènement appelle la méthode pour traiter l'évènement, on peut souvent récupérer le type d'évènement avec le paramètre "event" pour affiner le traitement.

    Mais certains évènements demande la présence du paramètre "event", et d'autre ne la réclame pas. J'ai donc pris comme habitude d'utiliser le paramètre "event=None" qui marche dans tous les cas.

    Un chaleureux conseil: traite chaque fenêtre dans une classe, et mets toutes les méthodes de traitement d'évènement dans cette classe. Cela complique un peu les exemples très simples, mais cela simplifie et rend le code plus clair et plus robuste dès que tu fais de vraies applications.

    Tyrtamos

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, 17h19
  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, 17h56
  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, 16h21
  4. Récupérer une valeur avec un textarea
    Par Viau dans le forum Langage
    Réponses: 6
    Dernier message: 14/02/2006, 18h09
  5. [Key.isDown] Controler une touche avec code ascii
    Par arnolem dans le forum Flash
    Réponses: 3
    Dernier message: 30/01/2006, 15h34

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