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 :

Limiter la saisie d'un Entry quand on appuie sur deux touche en même temps


Sujet :

Tkinter Python

  1. #1
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 91
    Points
    91
    Par défaut Limiter la saisie d'un Entry quand on appuie sur deux touche en même temps
    Bonjour, j'ai trouvé comment limiter la saisie d'un entry sur ce post : http://www.developpez.net/forums/sho...d.php?t=382534
    Et cela fonctionne si on appuie précisément sur une touche à la fois.

    Donc mon problème est que si par chance on appuie sur deux touches en même (genre faute de frappe), cela ne fonctionne plus du tout!!! Tout controle semble bloqué et n'importe quel caractère est affiché dans l'entry.

    voici le code que j'utilise :

    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
    # -*- coding:Latin-1 -*-
     
    from Tkinter import *
    global touche
    def onKey(event):
        global touche
        touche = event
     
    def val(event):
        global touche
        print touche
        print touche.char
        if touche:
            if touche.char in "0123456789:":
                return True
            else:
                if touche.keysym == "BackSpace":
                    return True
                else:
                    return False
    def ins12():
        #txt.event_generate("<KeyPress-0>")
        txt.insert(END, "12")
        print "inséré"
     
    root = Tk()
    txt = Entry(root)
    txt.pack()
    but=Button(root, text="insert 12", command=ins12)
    but.pack()
    txt.configure(validate="key",validatecommand=lambda : val(touche))
    txt.bind("<Key>",onKey)
    root.mainloop()
    Quelqu'un a-t-il une solution?

    PS : attention également avec ce code, comme la validation dépend de la variable "touche", si vous voulez insérer quelque chose dans l'entry après avoir appuyé sur une touche non comprise dans le test de validation, l'insertion ne se fera pas. Cela peut etre contourné en faisant un entry.event_generate("<KeyPress-unebonnetouche>") juste avant l'insertion de façon à ce que la variable "touche" soit dans la liste des caractères acceptés.

  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 280
    Points
    9 280
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Chez moi, ton code fonctionne, tant que je ne touche pas au bouton ins12.

    Au lieu d'utiliser la méthode .insert dans ins12, utilise carrément l'insertion d'évènement. Ainsi, cela respectera le protocole de validation. La fonction ins12 devient alors:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def ins12():
        global txt
        txt.event_generate("1")
        txt.event_generate("2")
        print "inséré"
    Et là, tout fonctionne, même quand je tape sur le clavier avec les 10 doigts en même temps .

    Il y a cependant une différence avec ton code, c'est que l'insertion du "12" se fait à l'emplacement du curseur et pas forcément à la fin.

    Tyrtamos

  3. #3
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 91
    Points
    91
    Par défaut
    Voilà, j'ai retesté mon code (voir 1er post) et j'ai toujours le même problème sous windows, à savoir que deux touches pressées en même temps, annulent le controle.

    Cependant, je viens de tester sous linux (mandriva 2008 dans mon cas), cela fonctionne parfaitement.

    Ils semble donc que cela viennent de la version de windows, du moins, ce serait ma première conclusion.

  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 280
    Points
    9 280
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Quand j'ai dit que ça marchait chez moi, c'était sous Windows XP SP2.

    Tu as essayé ma solution pour ins12?

    Tyrtamos

  5. #5
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 91
    Points
    91
    Par défaut
    Quand j'ai dit que ça marchait chez moi, c'était sous Windows XP SP2.
    Bonjour, je suis moi aussi sous windows xp sp2 et pourtant si je presse deux touches... vous savez la suite. Je ne sais pas d'où ça vient, donc si quelqu'un a une idée, je suis preneur.

    Tu as essayé ma solution pour ins12?
    oui merci, j'ai essayé, et j'ai même un peu adpaté pour mon utilisation...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def ins12():
        j = "3:4"
        for i in j:
            txt.event_generate("<KeyPress-%s>" %i)
    Meci encore pour toute l'aide apportée

Discussions similaires

  1. Récupérer le texte d'un entry quand on appuie sur un bouton
    Par drhouse87 dans le forum GTK+ avec C & C++
    Réponses: 7
    Dernier message: 27/12/2011, 14h05
  2. Créer un JLabel et JComboBox quand on appuie sur un bouton
    Par maxkarting25 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 16/05/2008, 18h26
  3. Réponses: 1
    Dernier message: 02/03/2008, 21h34
  4. Réponses: 25
    Dernier message: 18/12/2007, 22h06
  5. Jouer un son quand on presse sur une touche
    Par jbidou88 dans le forum Flash
    Réponses: 2
    Dernier message: 01/06/2006, 22h05

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