pynput

 

pynput est un module tiers (qui n’est pas fourni avec les distributions de Python) permettant de gérer les périphérique d’entrée/sortie de type clavier et souris.

Il permet de prendre le contrôle total du clavier ou de la souris :

  • accrocher des événements globaux,
  • enregistrez des touches de raccourci,
  • simulez des pressions de touches, des mouvement de souris, …
  • …

Documentation complète de pynput

 

Installation

Le module pynput est disponible sur pypi.org.

Depuis une fenêtre de commande ou un terminal :

pip install pynput

 

 

Événements clavier

L’interaction avec le clavier est accessible dans le sous-module keyboard:

from pynput import keyboard

Pour écouter les événements « clavier », on créer une instance de Listener, à laquelle on indique la fonction à exécuter en cas d’événement :

listener = keyboard.Listener(on_press = touche_pressee)

L’argument on_press est de type function : la fonction à appeler lorsqu’une touche du clavier est pressée.

Ce type de fonction est appelée callback.

 

Le Listener doit ensuite être démarré, et à la fin du programme arrêté !

listener.start()
... # les événements claviers sont "écoutés"
listener.stop()

 

Les fonctions callback doivent être définies avec un paramètre key de type keyboard.Key.

def touche_pressee(key):
    ...

L’objet key représente une touche de clavier.

  • S’il s’agit d’une touche de caractère, key possède un attribut char, ce qui permet facilement de la comparer à un caractère.
  • S’il s’agit d’une touche spéciale, comme les touches de combinaison (↑ Maj, Ctrl, Alt, …), c’est l’attribut qui donne la touche :
    exemples : Key.ctrl_l, Key.tab, …

 

Programme de démonstration

Le listener s’exécute dans un thread séparé du programme principal (exécution parallèle). Il doit être arrêté à la fin du programme principal.

Nettoyage explicite

On peut faire l’arrêt du listener (nettoyage) de manière explicite : listener.stop() à la fin du programme :

from pynput import keyboard

def touche_pressee(key):
    if hasattr(key, 'char'): # il s'agit d'un caractère
        print(key.char)
    else:
        print(key)

def touche_relachee(key):
    print(key)

listener = keyboard.Listener(on_press = touche_pressee, on_release = touche_relachee) 
listener.start()

continuer = True
while continuer: # boucle infinie (Ctrl+C pour quitter)
    pass

listener.stop()

Context manager

Mais si l’arrêt est dû à une exception (une erreur), il pourrait se produire des comportements inattendus, comme une instance du processus python qui reste ouverte et un listener qui ne s’arrête pas.

Pour éviter cela, la meilleure méthode consiste à utiliser un context manager :  

from pynput import keyboard

class Listener:
    def __init__(self):
        self.listener = keyboard.Listener(on_press = self.touche_pressee)

    def touche_pressee(self, key):
        print(f"Touche pressée : {key}")

    def start(self):
        self.listener.start()

    def stop(self):
        self.listener.stop()
        self.listener.join()


class MonApplication:
    def __init__(self):
        self.ecouteur = Listener()

    def __enter__(self):
        self.ecouteur.start()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.ecouteur.stop()

    def run(self):
        self.continuer = True
        while self.continuer: # boucle infinie (Ctrl+C pour quitter) 
            pass


# Utilisation :
with MonApplication() as app:
    app.run()

 

Vous aimerez aussi...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *