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 :

Simulation de frappe clavier avec Python 3.6


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Points : 34
    Points
    34
    Par défaut Simulation de frappe clavier avec Python 3.6
    Bonjour à tous.
    J'ai un script Python qui,pour faire court, a la structure suivante

    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
    #! /usr/bin/env python3
    # -*- coding: utf-8 -*-
    import gui
    import fichiers_6
     
    def filtre(event)
        global,a,b,c,d
        lt = str(event.keysym)
        if lt != "q" and lt != "F12" and lt != KP_1:
            return
        if contexte == 1:
            ....
            ....
        return
     
        if contexte == 2:
            ....
            ....
        return
     
        if contexte == 3:
            ....
            ....
        return
     
     
     
     
    # point d'entrée
    initialisation() # il s'agit d'une fonction qui est dans le module fichiers_6
    print('pref ', dicoPref)
    print('stat ', dicoStat)
    ...
    ...
    ...
    fen1.bind('<KeyPress>', filtre)
    fen1.mainloop()
    Evidemment le traitement des conditions contexte = 1, 2, 3 contient des appels à de nombreuses fonctions et tout ce passe bien en mode manuel normal. Il suffit d'appuyer sur l'une des touches que j'ai choisies de façon arbitraire pour déclencher le traitement souhaité. Tout serait donc parfait si j'en restait là. Mais il se trouve que pour pouvoir exploiter les informations récoltées, j'ai besoin de laisser tourner ce script plusieurs heures. J'ai donc intégré à ce script un mode dit 'AUTO' qui le répète indéfiniment en pressant à chaque fois la touche 1 du pavé numérique à ma place avec quelque part une boucle while qui relance le processus tant que la variable auto est True.
    et ca marche. Heu, presque bien car je m'embrouille pour stopper l'essai et si j' interrompt le script brutalement des fichiers qui devraient être écrits ne le sont pas, et ça plante lamentablement.
    Alors ma question est très simple
    Comment faire pour que l'avant dernière ligne du programme contienne autre chose que ('<KeyPress>') ? Autrement dit comment faire pour que je fasse croire au script que j'ai effectivement tapé KP_1 pour le lancer manuellement ? Après cela il me suffira à l'entrée de la fonction filtre(event) d'autoriser l'entrée d'une touche supplémentaire qui interrompra le mode AUTO.
    Je précise que pour rendre le script automatique, j'ai rajouté ceci à la fin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    auto = True
            while auto == True:
                lt ="KP_1"
                mon_filtre(lt)
    et pour cela supprimé les évènements clavier. Donc comment faire ?

  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,

    .event_generate peut aider... mais restructurer votre code pour s'exécuter un certain nombre de fois sans passer par le clavier fonctionne aussi.

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

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Points : 34
    Points
    34
    Par défaut
    hum, j'ai potassé, enfin, consulté dirais-je la méthode .event_generate mais cela ne m'a guère aidé.
    Quelle syntaxe doit-t-on utiliser pour concrètement lui demander d'envoyer à la fonction filtre(event) l'évènement fen1.bind('<KeyPress>' ,filtre) si je souhaite lui faire croire que j'ai effectivement frappé la touche 1 du pavé numérique (KP_1)
    Sans la frapper concrètement bien sûr ?
    J'ai risqué fen1.event_generate(filtre('KP_1')) mais ca n'a pas marché

    sinon votre remarque (mais restructurer votre code pour s'exécuter un certain nombre de fois sans passer par le clavier fonctionne aussi) me tente aussi. Un petit exemple, peut-être
    Peut-être placer la fonction principale dans une boucle while ? .......

    Merci de m'aider.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Points : 34
    Points
    34
    Par défaut
    Bien j'ai abandonné l'idée de faire réagir la fonction filtre aux évènements (clavier ou souris) et je lui passe maintenant le nom de la touche que je souhaite simuler. Puis j'ai inséré cette fonction dans une boucle for i in range(0,1000) et cela fonctionne très bien et évidemment le script n'est plus "sauvagement interrompu" Ce n'est pas joli, joli, j'en suis conscient mais ca marche. Et d'ailleurs ce mode automatique ne m'est utile que pour tester les résultats et les enregistrer dans des fichiers et des dictionnaires. En mode "manuel" le script est parfaitement fonctionnel et a beaucoup plus de fonctionnalités. Donc à moins que vous ne me donniez quelque chose de plus propre, je vais rester sur cette solution bâtarde, mais fonctionnelle.

  5. #5
    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
    Citation Envoyé par azad2b Voir le message
    Quelle syntaxe doit-t-on utiliser pour concrètement lui demander d'envoyer à la fonction filtre(event) l'évènement fen1.bind('<KeyPress>' ,filtre) si je souhaite lui faire croire que j'ai effectivement frappé la touche 1 du pavé numérique (KP_1)
    Si vous cherchiez un peu sur Internet, vous auriez plein d'exemples.
    Tenez j'en ajoute un:
    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
    import tkinter as tk
     
    def on_key(event):
        print('on_key', event.keysym, event.keycode)
     
    event_id = None
    def do_generate(delay=500):
        global event_id
        root.event_generate('<Key-K>', when='tail', keysym='K')
        event_id = root.after(delay, do_generate)
     
    def do_stop_generate():
        global event_id
        if event_id is not None:
            root.after_cancel(event_id)
            event_id = None
     
    root = tk.Tk()
    root.bind('<Key>', on_key)
    tk.Button(root, text='start', command=do_generate).pack()
    tk.Button(root, text='stop', command=do_stop_generate).pack()
    tk.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Points : 34
    Points
    34
    Par défaut
    Je vous remercie, votre exemple est très clair, et fonctionne parfaitement. Et ce n'est pas le cas des scripts que j'ai consulté avant de faire appel à un forum. Tous se compliquent inutilement en faisant appel à des classes, en répondant génération évènement souris ou bouton quand on leur demande des évènements clavier, et face à tant d'inepties on en arrive à croire que la suite va être de la même eau... et on passe ailleurs pour tomber sur un bavard qui fait plein de fautes d' orthographe et que l'on quitte très vite en craignant le pire, sans oublier Google lui-même qui vous parle de l'évènement soulevé par la dernière production des Monty-Python.
    Merci, à vous, donc. Quand je pense que j'ai passé un bon quart d'heure à tabuler mon code !

Discussions similaires

  1. [Debutant] Simuler une frappe clavier
    Par SofEvans dans le forum Langage
    Réponses: 3
    Dernier message: 11/07/2011, 10h02
  2. [XL-2003] Macro excel simule frappe clavier
    Par tony020422 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 10/06/2009, 10h07
  3. Simulation de frappe des lettres au clavier
    Par zed80 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 26/02/2009, 12h09
  4. BATCH - Simulation frappe clavier
    Par ob1knob dans le forum Windows
    Réponses: 1
    Dernier message: 17/11/2006, 13h38
  5. Réponses: 5
    Dernier message: 29/12/2005, 15h03

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