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 :

<Enter> dans une Entry => <Enter>+<Tabulation>


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 36
    Points
    36
    Par défaut <Enter> dans une Entry => <Enter>+<Tabulation>
    Bonjour,

    J'ai un canevas avec pleins d'entries dedans. La plupart de ces entries ont une méthode bind (pour les touches <Enter> et <Tabulation>) avec des variables contenues dans des labels.

    Lorsqu'on presse la touche <Enter> après avoir entré une valeur dans une entry, je souhaiterais
    1- que la variable liée à la touche soit actualisée, ce que bind fait très bien;
    2- que le curseur passe à l'entry suivante, en fait ce qui est réalisé par la touche <Tabulation>.

    Quelqu'un sait-il programmer cette deuxième étape?

    Merci pour votre sagacité.

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    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 478
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il faut donc que l'évènement déclenché par la touche entrée sur le 1er entry mette le focus sur le 2ème entry.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    entrysuivant.focus_set()
    Tyrtamos

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 36
    Points
    36
    Par défaut
    Merci pour cette première réponse. C'est une solution à laquelle j'avais pensé. Cela implique de mettre autant de lignes de code que d'entries...

    N'existe-t-il pas une solution plus élégante? En d'autres termes une liaison entre <Enter> et <Tab>.

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    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 478
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il suffit de valider l'entry par tab au lieu de entrée, et le focus passe automatiquement sur l'entry suivante. Cela correspond à l'utilisation de la plupart des formulaires web, et cela ne surprendra donc personne.

    Mais tu ne dis pas grand chose de ton code: est-ce que la validation de chaque entry est censée déclencher un évènement ou est-ce que tu attends la fin pour ça?

    Tyrtamos

  5. #5
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Points : 6 789
    Points
    6 789
    Billets dans le blog
    15
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    ...
    Mais tu ne dis pas grand chose de ton code: est-ce que la validation de chaque entry est censée déclencher un évènement ou est-ce que tu attends la fin pour ça?...

    Tyrtamos

    frites.saucisse,

    J'ai eu, je pense un problème similaire à résoudre. Pour reprendre la question de tyrtamos, si tu peux attendre la fin pour déclencher un évènement, pourquoi pas utiliser tout simplement un button pour le déclencher...

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    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 478
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    Oui, le plus simple est manifestement d'attendre la fin et d'avoir un bouton en bas qui fait le reste.

    Si, cependant, tu souhaites un évènement à chaque sortie d'entry, voilà une autre idée: créer un évènement virtuel.

    Pour chaque entry, tu aurais quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            self.saisie1=Tkinter.Entry(self)
            self.saisie1.event_add ( "<<validsaisie1>>", "<Return>","<KP_Enter>","Tab")
            self.saisie1.bind("<<validsaisie1>>", self.validsaisie1)
    Avec bien sûr le traitement de l'évènement déclenchée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        def validsaisie1(self,event):
            etc...
    Grâce à cet évènement virtuel appelé ici <<validsaisie1>> et enregistrée par ".event_add()", n'importe laquelle des 3 touches: entrée, entrée-du-keypad, et tab déclenche l'évènement qui peut enregistrer la valeur de l'entry dans une variable (après vérification éventuelle de la validité de l'entrée).

    Mais bien sûr, seule la touche tab met le focus automatiquement sur l'entry suivante. Tu pourrais ajouter dans le traitement de l'évènement le focus obligé dans l'entry suivante comme je te le proposais plus haut.

    Voilà ce que ça pourrait donner comme 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
    46
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import Tkinter
     
    class Application(Tkinter.Frame):
     
        def __init__(self, master=None):
            Tkinter.Frame.__init__(self, master)
            self.grid()
     
            self.saisie1=Tkinter.Entry(self)
            self.saisie1.grid(row=0)
            self.saisie1.event_add ( "<<validsaisie1>>", "<Return>","<KP_Enter>","Tab")
            self.saisie1.bind("<<validsaisie1>>", self.validsaisie1)
     
            self.saisie2=Tkinter.Entry(self)
            self.saisie2.grid(row=1)
            self.saisie2.event_add ( "<<validsaisie2>>", "<Return>","<KP_Enter>","Tab")
            self.saisie2.bind("<<validsaisie2>>", self.validsaisie2)
     
            self.saisie3=Tkinter.Entry(self)
            self.saisie3.grid(row=2)
            self.saisie3.event_add ( "<<validsaisie3>>", "<Return>","<KP_Enter>","Tab")
            self.saisie3.bind("<<validsaisie3>>", self.validsaisie3)
     
            self.saisie1.focus_set()
     
        def validsaisie1(self,event):
            self.valsaisie1=self.saisie1.get()
            self.saisie2.focus_set()
     
        def validsaisie2(self,event):
            self.valsaisie2=self.saisie2.get()
            self.saisie3.focus_set()
     
        def validsaisie3(self,event):
            self.valsaisie3=self.saisie3.get()
            self.saisie1.focus_set()
     
    if __name__ == "__main__":
        fenetre=Tkinter.Tk()
        fenetre.title("Test")
        app=Application(fenetre)
        fenetre.mainloop()
    Tyrtamos

    [edit]: suppression du "takefocus=1" du code, inutile ici.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 36
    Points
    36
    Par défaut
    Merci pour ces réponses.

    Pour répondre à la question: je ne souhaite pas déclencher les événements à la fin, mais vraiment après que chaque entry soit remplie.

    J'apprécie le truc de l'événement virtuel qui permet de grouper plusieurs touches de clavier pour une même action.

    Je pense que je vais me résoudre à insérer des focus_set() dans tous les coins... L'ennui est que dans mon code toutes les entries portent le même nom. Il faudra que je change cela, à moins qu'il existe une commande générale du type "next_entry".focus_set() ?

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    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 478
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    A ma connaissance, il n'existe pas de ""next_entry".focus_set()".

    J'ai cherché un peu parce que dans certains langages, on peut définir un numéro d'index qui dit dans quel ordre on parcourt les entry avec le focus. Mais ici, l'ordre est donné par l'ordre de la création des entry lors de la construction de l'instance de classe. On peut seulement neutraliser le passage par une entry donnée en lui ajoutant un "takefocus=0" dans sa config.

    Par contre, tu devrais ajouter à l'évènement virtuel l'évènement qui consiste à quitter avec la souris l'entry qui a le focus (FocusOut?). Je n'ai pas essayé, mais tu peux avoir plus d'info en consultant le chapitre 24 de la notice de Tkinter: http://www.nmt.edu/tcc/help/lang/python/tkinter.pdf

    Tyrtamos

Discussions similaires

  1. [Python 3.X] Afficher les resultat dun hashage dans une ENTRY
    Par clododil dans le forum Tkinter
    Réponses: 0
    Dernier message: 20/05/2015, 17h02
  2. Masquer un mot de passe dans une Entry
    Par julientalbourdet dans le forum Tkinter
    Réponses: 2
    Dernier message: 27/07/2009, 12h59
  3. Duplicate Entry dans une relation N-N
    Par fabseven dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 02/02/2008, 18h11
  4. Navigation dans une Jtable avec enter
    Par grabriel dans le forum Composants
    Réponses: 1
    Dernier message: 19/12/2006, 19h41
  5. Réponses: 2
    Dernier message: 24/11/2005, 22h30

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