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

Python Discussion :

empêcher réponses rapides du clavier.


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut empêcher réponses rapides du clavier.
    Voilà, tout est dans la question. Je suis électronicien, et je connais, hélas, les soucis que peuvent procurer les switch, boutons poussoirs ou autres interrupteurs de qualités douteuses. Et via quelque bascules, monostables ou réseau R,C, je sais y remédier. Et je suppose que les fabricants de claviers, intègrent à leur gestionnaire de saisie les mêmes procédés. Ma question est donc, comment faire cela en Python ?
    Je précise que mon script python a été créé sous Linux (Ubuntu) et qu'il est appelé à tourner sous MacOS, Linux, Windows et Raspberry. Sur Mac et Linux j'ai trouvé les renseignements sur les variables globales système gérant cela, sur raspberry, cela peut se résoudre grâce à deux sous d 'électronique, mais sous Win ? Et d'ailleurs j'avoue que rallonger un script avec des conditions s'assimilant à de la compilation conditionnelle ne m'enchante guère.
    J'ai un script qui ressemble au schéma classique :

    Une litanie de fonctions
    ...
    ...
    ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    root1.bind( '<Key>',maFonction )
     
    root1mainloop()
    os.system( 'xset r on' ) 
    quitter()
    J'utilise la programmation procédurale et tkinter. Pas de POO.
    J'ai consulté la liste des méthodes associées à la gestion des évènement et n'ai rien trouvé.

    Ce que j'espérais c'était trouver quelque chose qui dans la ligne

    root1.bind( '<Key>',maFonction ) me permettrait d'écrire quelque chose comme :

    root1.after (duree, bind( '<Key>',maFonction )) où durée serait en millisecondes.

    Si quelqu'un à une solution, quitte à utiliser autre chose que tkinter, je suis preneur. Ou peut être encore quelque chose à écrire dans "maFonction" qui reçoit le code caractère saisi au clavier et n'en accepte qu'un si l'utilisateur a frappé trop vite.....

    Ha oui, tout de même, Quelques essais avec time() et end-start, n'ont rien donnés de concluant. Merci, par avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,

    Si l'utilisateur garde la touche appuyée, on aura une rafale d'évènements de type Key.
    Il sera plus gérable d'attraper KeyRelease...

    Si on veut ignorer ceux qui suivent pendant un intervalle de temps donné, je ne vois pas trop la difficulté (mais je n'ai peut être pas compris le soucis).

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

  3. #3
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut
    Bonjour wistricks, et merci.

    Tout à fait, c'est pourquoi dans mon script j'ai modifié la variable système r avec la commande "xset r off" et que je lui redonne sa valeur normale 'on' en sortant du script avec os.system( "xset r on" ) pour ne pas obliger l'utilisateur à réactiver la répétition des touches. Mais en fait ma question revient à celle-ci: comment vider la pile des évènements claviers pour empêcher quelqu'un de trop rapide de pianoter sur son clavier ( supposons qu'il soit atteint de la maladie de Parkisson )
    Et KeyRelease ne devrait solutionner la question qu'à moitié face à un virtuose de la frappe clavier.
    En fait, idéalement j'aimerais que la pile des évènements claviers soit vidée après l'acquisition de la première touche frappée, car j'ai de toutes façons installé un filtre qui dans la fonction recevant les évènements refuse les touches nons reconnues .

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Citation Envoyé par azad2b Voir le message
    En fait, idéalement j'aimerais que la pile des évènements claviers soit vidée après l'acquisition de la première touche frappée
    Il n'y a pas de fonctionnalité pour "vider" la pile: soit on arrête de réagir aux évènements (avec .unbind) soit on les ignore... et en cherchant un peu vous avez des exemples comme celui-ci.

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

  5. #5
    Invité
    Invité(e)
    Par défaut
    Pas sûr de comprendre, avec un timer ça ne fait pas l'affaire ?

    Sinon chercher de ce côté :
    https://stackoverflow.com/questions/...e-input-stream

  6. #6
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut
    wiztricks, bonjour
    L'exemple que vous me donnez; ne fonctionne pas. La touche <Up> maintenue pressée engendre plusieurs réponses. On peut bloquer la répétition des touches en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import tkinter as Tk
    import os
     
    os.system('xset r off')  # désactive la répétition des touches
    def hello(x):
        print ("Hello")
     
    root = Tk.Tk()
    root.bind("<Up>", hello)
    root.mainloop()
    os.system('xset r on')  # réactive la répétition des touches
    Mais plusieurs frappes rapides sur <Up> correspondent à plusieurs event différents, et sont donc acceptées, ce qui m'ennuie.

    LeNarvalo. Salut, à vous.

    Je précise un peu la chose :
    Si une touche pressée est acceptée comme étant valide, le script continue et lance une foultitude de fonctions, dont certaines utilisent la fonction time et le temps total d'exécution est loin d'être négligeable. Alors, est-ce à cause de cela ? Mais ca ne marche pas. J'aimerais bien avoir un analyseur de script m'affichant les appels et les durées d'exécution, mais mes connaissances en Python sont vraiment rudimentaires et je ne sais pas installer un tel utilitaire.
    En fait ce que je voudrais, c'est qu'une fois une touche frappée, la même touche frappée une seconde fois, n'engendre aucun effet. Du moins, pas avant ... disons 200 milli-secondes

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

Discussions similaires

  1. Activer la réponse rapide
    Par _Snoopy dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 29/10/2010, 11h21
  2. [phpBB][3] Réponse rapide
    Par troumad dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 10
    Dernier message: 09/04/2008, 12h57
  3. empêcher bascule rapide sous Vista !
    Par pageweb dans le forum Windows Vista
    Réponses: 1
    Dernier message: 18/03/2007, 04h42

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