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 :

récupérer une chaine en cours de saisie


Sujet :

Tkinter Python

  1. #1
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut récupérer une chaine en cours de saisie
    Bonjour,

    Je veux inspecter une chaine de caractère à chaque frappe de touche.

    J'essaye de le faire en capturant l'événement <Key> puis en récupérant la chaine avec get(). Le problème est que get() me donne la chaine privée de la dernière frappe. Je peux récupérer cette frappe avec event.char, mais ça ne m'avance pas tellement car je ne sais pas où est le curseur au moment de la frappe. Pour illustrer ma question, j'ai programmé une calculette qui est supposée donner le résultat en cours de frappe. Tout marche bien sauf si je m'amuse à saisir des choses au milieu.
    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
    import tkinter as tk
    from math import *
    import string
     
    res=''
    res0=''
    def evaluer(event):
        global res, res0, tk_texte, tk_resultat
        # problème : cette ligne ne récupère pas le dernier caractère !
        txt = tk_entree.get()
        # Je peux le rajouter comme ça, mais ça ne marche que si le curseur est en fin de ligne.
        if event.char in string.printable:
            txt += event.char
        tk_texte.configure(text = txt)
        try:
            res0 = res
            res = '= ' + str(eval(txt))
        except:
            if res[-1] != '?': res=res0 + '?'
        tk_resultat.configure(text = res) # change l'attribut text de l'objet resultat
     
    # ----- Programme principal : -----
     
    # création des objets tinker
    tk_fenetre = tk.Tk() # crée la fenêtre principale
    tk_entree = tk.Entry(tk_fenetre) # crée un objet "ligne de saisie" dans fenetre
    tk_texte = tk.Label(tk_fenetre) # crée un objet texte dans fenêtre
    tk_resultat = tk.Label(tk_fenetre) # crée un objet texte dans fenêtre
     
    # mise en page
    tk_entree.pack() # dispose entree dans la fenêtre, à la taille minimum
    tk_texte.pack()
    tk_resultat.pack() 
     
    # définition des événements 
    tk_entree.bind("<Key>", evaluer) # la touche return dans entrée appelle evaluer 
     
    # lancement
    tk_entree.focus_set() # donne le focus à la boite de saisie
    tk_fenetre.mainloop() # lance l'appli
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Le widget Entry sait déjà faire des choses pour vous permettre de récupérer le dernier caractère tapé et valider ou pas la saisie.
    Vous pouvez regardez des exemples de mises en œuvre par exemple ici.


    Pour bien apprendre Python suis ces tutoriels et cours de formation Python : http://python.developpez.com/cours/
    Un bon livre Python : Apprendre à programmer avec Python 3 par Gérard Swinnen http://python.developpez.com/cours/apprendre-python3/

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut
    Merci pour le lien. C'est ce qui me fallait.

    La solution était donc :
    1/ d'associer la ligne de saisie à un objet tkinter.StringVar pour pouvoir profiter des méthodes associées
    2/ de brancher le callback non pas sur une frappe au clavier, mais à la modification de la variable elle-même. J'avoue que c'est une méthode extrêmement puissante.

    Voila le code de ma calculette. Le résultat du calcul est affiché au vol (en cours de saisie). Quand, transitoirement, la formule n'a pas de signification, un '?' est affiché à la place du résultat.
    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
    import tkinter as tk
    from math import *
    import string
     
    res=''
    res0=''
    def evaluer(*args):
        global res, res0, tk_texte, tk_resultat
        txt = tk_s.get()
        try:
            res0 = res
            res = '= ' + str(eval(txt))
        except:
            res = '?'
        tk_resultat.configure(text = res) # change l'attribut text de l'objet resultat
     
    # ----- Programme principal : -----
     
    # création des objets tinker
    tk_root = tk.Tk() # crée la fenêtre principale
    tk_s = Tk.StringVar() # la chaine en cours de saisie
    tk_entree = tk.Entry(tk_root, textvariable=tk_s) # crée un widget "ligne de saisie" dans fenetre. Associe la saisie à la variable tk_s
    tk_resultat = tk.Label(tk_root) # crée un widget texte pour le résultat du calcul
     
    # mise en page
    tk_entree.pack()
    tk_resultat.pack() 
     
    # définition des événements 
    # Le seul événement capturé est la modification de la chaine en cours de saisie
    tk_s.trace_variable("w", evaluer) 
     
    # lancement
    tk_entree.focus_set() # donne le focus à la boite de saisie
    tk_root.mainloop() # lance l'appli
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

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

Discussions similaires

  1. [RegEx] Récupérer une chaine dans un source HTML
    Par Lawyer666 dans le forum Langage
    Réponses: 4
    Dernier message: 27/04/2007, 18h25
  2. Réponses: 10
    Dernier message: 25/03/2007, 21h39
  3. Réponses: 5
    Dernier message: 22/06/2006, 17h19
  4. Récupérer une chaine de caractère dans une page
    Par BrunS dans le forum Langage
    Réponses: 3
    Dernier message: 15/11/2005, 14h28
  5. [IO]Récupérer une chaine texte dans un flux HTTP
    Par elitost dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 16/03/2005, 10h39

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