web-dev-qa-db-fra.com

Des auditeurs clés en python?

Existe-t-il un moyen de créer des écouteurs clés en python sans un module volumineux tel que pygame?

Un exemple serait, quand j'ai appuyé sur le a clé il imprimerait sur la console

La touche a été pressée!

Il devrait également écouter les touches fléchées/barre d'espace/touche majuscule.

26
ollien

Ce n'est malheureusement pas si facile à faire. Si vous essayez de créer une sorte d’interface utilisateur texte, vous voudrez peut-être examiner curses . Si vous voulez afficher des choses comme vous le feriez normalement dans un terminal, mais que vous voulez une telle entrée, vous devrez alors utiliser termios , qui semble malheureusement être mal documenté en Python. Malheureusement, aucune de ces options n’est aussi simple. En outre, ils ne fonctionnent pas sous Windows; si vous avez besoin qu'ils fonctionnent sous Windows, vous devrez utiliser PDCurses pour remplacer curses ou pywin32 plutôt que termios.


J'ai pu obtenir que cela fonctionne décemment. Il affiche la représentation hexadécimale des clés que vous tapez. Comme je l'ai dit dans les commentaires de votre question, les flèches sont délicates; Je pense que vous serez d'accord.

#!/usr/bin/env python
import sys
import termios
import contextlib


@contextlib.contextmanager
def raw_mode(file):
    old_attrs = termios.tcgetattr(file.fileno())
    new_attrs = old_attrs[:]
    new_attrs[3] = new_attrs[3] & ~(termios.ECHO | termios.ICANON)
    try:
        termios.tcsetattr(file.fileno(), termios.TCSADRAIN, new_attrs)
        yield
    finally:
        termios.tcsetattr(file.fileno(), termios.TCSADRAIN, old_attrs)


def main():
    print 'exit with ^C or ^D'
    with raw_mode(sys.stdin):
        try:
            while True:
                ch = sys.stdin.read(1)
                if not ch or ch == chr(4):
                    break
                print '%02x' % ord(ch),
        except (KeyboardInterrupt, EOFError):
            pass


if __== '__main__':
    main()
20
icktoofay

Voici comment le faire sous Windows:

"""

    Display series of numbers in infinite loop
    Listen to key "s" to stop
    Only works on Windows because listening to keys
    is platform dependent

"""

# msvcrt is a windows specific native module
import msvcrt
import time

# asks whether a key has been acquired
def kbfunc():
    #this is boolean for whether the keyboard has bene hit
    x = msvcrt.kbhit()
    if x:
        #getch acquires the character encoded in binary ASCII
        ret = msvcrt.getch()
    else:
        ret = False
    return ret

#begin the counter
number = 1

#infinite loop
while True:

    #acquire the keyboard hit if exists
    x = kbfunc() 

    #if we got a keyboard hit
    if x != False and x.decode() == 's':
        #we got the key!
        #because x is a binary, we need to decode to string
        #use the decode() which is part of the binary object
        #by default, decodes via utf8
        #concatenation auto adds a space in between
        print ("STOPPING, KEY:", x.decode())
        #break loop
        break
    else:
        #prints the number
        print (number)
        #increment, there's no ++ in python
        number += 1
        #wait half a second
        time.sleep(0.5)
13
CMCDragonkai

Il existe un moyen de créer des écouteurs clés en python. Cette fonctionnalité est disponible via pynput .

Ligne de commande:

> pip install pynput

Code python:

from pynput import ket,listener
# your code here
9
Jayk

Je cherchais une solution simple sans focus fenêtre. La réponse de Jayk, pynput, me convient parfaitement. Voici l'exemple comment je l'utilise.

from pynput import keyboard

def on_press(key):
    try: k = key.char # single-char keys
    except: k = key.name # other keys
    if key == keyboard.Key.esc: return False # stop listener
    if k in ['1', '2', 'left', 'right']: # keys interested
        # self.keys.append(k) # store it in global-like variable
        print('Key pressed: ' + k)
        return False # remove this if want more keys

lis = keyboard.Listener(on_press=on_press)
lis.start() # start to listen on a separate thread
lis.join() # no this if main thread is polling self.keys
7
Xiangrui Li

clavier

Prenez le contrôle de votre clavier avec cette petite bibliothèque Python. Accrochez des événements mondiaux, enregistrez des raccourcis clavier, simulez des appuis sur des touches et bien plus encore.

Crochet d'événement global sur tous les claviers (capture les touches indépendamment du focus) . Écouter et envoyer des événements au clavier . Fonctionne avec Windows et Linux (nécessite Sudo), avec un support expérimental pour OS X (merci @glitchassassin!) . Pure Python, pas de modules C à compiler . Zéro dépendance. Simple à installer et à déployer, il suffit de copier les fichiers . Python 2 et 3 . Prise en charge de touches de raccourci complexes (par exemple, Ctrl + Maj + M, Ctrl + Espace) avec délai d’expiration contrôlable . Inclut une API de haut niveau (par exemple, enregistrer et lire, add_abbreviation) . Cartes clés telles qu'elles se trouvent réellement dans votre mise en page, avec prise en charge complète de l'internationalisation (par exemple, Ctrl + ç) . Les événements capturés automatiquement dans un fil séparé ne bloquent pas le programme principal . Testé et documenté . Ne casse pas les touches mortes accentuées (je te regarde, pyHook) . Prise en charge de la souris disponible via la souris du projet (souris pour installation rapide).

De README.md :

import keyboard

keyboard.press_and_release('shift+s, space')

keyboard.write('The quick brown fox jumps over the lazy dog.')

# Press PAGE UP then PAGE DOWN to type "foobar".
keyboard.add_hotkey('page up, page down', lambda: keyboard.write('foobar'))

# Blocks until you press esc.
keyboard.wait('esc')

# Record events until 'esc' is pressed.
recorded = keyboard.record(until='esc')
# Then replay back at three times the speed.
keyboard.play(recorded, speed_factor=3)

# Type @@ then press space to replace with abbreviation.
keyboard.add_abbreviation('@@', '[email protected]')
# Block forever.
keyboard.wait()
6
Anton Tarasenko

Bien que j'aime utiliser le module de clavier pour capturer des événements de clavier, je n'aime pas sa fonction record() car il retourne un tableau comme [KeyboardEvent("A"), KeyboardEvent("~")], que je trouve difficile à lire. Donc, pour enregistrer des événements de clavier, j'aime utiliser le module de clavier et le module de threading simultanément, comme ceci:

import keyboard
import string
from threading import *


# I can't find a complete list of keyboard keys, so this will have to do:
keys = list(string.ascii_lowercase)
"""
Optional code(extra keys):

keys.append("space_bar")
keys.append("backspace")
keys.append("shift")
keys.append("esc")
"""
def listen(key):
    while True:
        keyboard.wait(key)
        print("[+] Pressed",key)
threads = [Thread(target=listen, kwargs={"key":key}) for key in keys]
for thread in threads:
    thread.start()
1
Sipher_