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.
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()
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)
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
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
Sudo pip install keyboard
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()
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()