diff --git a/README.md b/README.md index 362fb37..75c93da 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,72 @@ -# keypress -Module multi-plateforme permettant de récupérer les touches de clavier pressées. +Simple module permettant de récupérer les touches de clavier pressées. + +### Pourquoi ce module ? + +J'ai créée un langage de programmation, [`Callect`](https://github.com/4surix/callect), et j'avais besoin de récupérer les touches de clavier pressées pour mon [event keypress](https://github.com/4surix/callect/wiki/Event-keys). + +J'ai trouvée des solutions, mais soit elle été trop complexe, soit trop volumineuse (`Tkinter`, `Pygame`, `pynput`, `curses`, ...). + +Je suis tombée sur [ce poste](http://code.activestate.com/recipes/134892), qui permettait de faire ce que je voulais, mais le code n'est pas optimisé et assez désordonné. + +J'ai du coup, à partir du code présent dans le poste, fait un module simple, léger, propre, pour juste capturer les touches pressées. + +### Documentation + +Les fonctions ci-dessous sont bloquantes. + +**Attention**, si vous utilisez plusieurs `thread` dans votre programme, et que dans l'un vous utilisez ces fonctions et dans l'autre vous utilisez `input` (ou `sys.stdin`) en même temps, cela peut ne pas fonctionner correctement. + +#### getKey() -> str + +Renvoie la touche pressée brute. +Cela ne gère pas les touches faite en plusieurs caractères. + +```python +import keypress + +if keypress.getKey() == '\t': + print('Vous avez pressée la touche de tabulation !') + +if keypress.getKey() == '\xe0': + if keypress.getKey() == 'H': + print('Vous avez pressée la touche flèche du haut !') +``` + +#### getName() -> str + +Renvoie le nom de la touche pressée. + +```python +import keypress + +if keypress.getName() == 'Tab': + print('Vous avez pressée la touche de tabulation !') + +if keypress.getName() == 'Up': + print('Vous avez pressée la touche flèche du haut !') +``` + +### Touches disponibles : +| Touche | Description | +| ------- | ----------- | +| `a-z` | Toute les touches de `a` à `z` minuscule. | +| `A-Z` | Toute les touches de `A` à `Z` majuscule. | +| `0-9` | Tout les chiffres de `0` à `9` | +| `\w` | Toute les touche basique (`é`, `{`, `-`, `@`, ...)| +| `Ctrl+[a-z]` | Toute les combinaisons `Ctrl` + `a` à `z`. | +| `AltGr+[a-z]` | Toute les combinaisons `Alt Gr` + `a` à `z`. | +|`F1-F12` | Toutes les touches fonction de `F1` à `F12` | +|`Escape` | Touche échappe | +|`Return` | Touche entrée | +|`Up` | Touche flèche du haut | +|`Down` | Touche flèche du bas | +|`Left` | Touche flèche de gauche | +|`Right` | Touche flèche de droite | +|`Tab` | Touche tabulation | +|`Delete` | Touche Suppr | +|`Insert` | Touche Inser | +|`Begin` | Touche Début | +|`End` | Touche Fin | +|`PageUp` | Remonte d'une page | +|`PageDown` | Descend d'une page | +|`BackSpace` | Touche supprimer (flèche vers la gauche) | \ No newline at end of file diff --git a/keypress.py b/keypress.py new file mode 100644 index 0000000..c743d6d --- /dev/null +++ b/keypress.py @@ -0,0 +1,199 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# Python 3.6.2 +# ---------------------------------------------------------------------------- + +"""Capture de touche clavier pressée. + +Utilisation: +``` +import keypress + +if keypress.getName() == 'Tab': + print('Tab !') + +if keypress.getKey() == '\t': + print('Tab !') +``` +""" + +__title__ = "keypress" +__author__ = "Asurix" +__license__ = "MIT" +__version__ = "1.0.0" +__github__ = "https://github.com/4surix/keypress" + + +import string +import platform + + +name_system = platform.system() + +if name_system == 'Linux': + + import sys, tty, termios + + def getKey() -> str: + + key = '' + + descripteur_fichier:int = sys.stdin.fileno() + anciens_parametres = termios.tcgetattr(descripteur_fichier) + + try: + # Définit le mode du descripteur de fichier à row. + tty.setraw(descripteur_fichier) + # Lis le prochain caractère. + key = sys.stdin.read(1) + + finally: + # Remet les valeurs du descripteur de fichier comme avant + # après la transmission de toute sortie en file d’attente. + termios.tcsetattr( + descripteur_fichier, termios.TCSADRAIN, anciens_parametres + ) + + return key + +elif name_system == 'Windows': + + import time + from msvcrt import getch, kbhit + + def getKey() -> str: + + while not kbhit(): + time.sleep(0.1) + + return chr(getch()[0]) + +elif name_system == 'Darwin': + + import Carbon + + EventAvail = Carbon.Evt.EventAvail + GetNextEvent = Carbon.Evt.GetNextEvent + + def getKey() -> str: + + if EventAvail(0x0008)[0] == 0: + return '' + + else: + return chr(GetNextEvent(0x0008)[1][1] & 0x000000FF) + + +COMBI_CTRL = { + chr(i): 'Ctrl+' + carac + for i, carac in enumerate(string.ascii_uppercase, start=1) +} + +COMBI_ALTGR = { + chr(i): 'AltGr+' + carac + for i, carac in enumerate( + 'AZERTYUIOP????QSDFGHJKLM????WXCVBN', + start=16 + ) +} + +def getName() -> str: + + key = getKey() + + if key == '\x08': + key = 'BackSpace' + + elif key == '\x1b': + key = 'Escape' + + elif key == '\r': + key = 'Return' + + elif key == '\t': + key = 'Tab' + + elif key == '\xe0': + + key = getKey() + + if key == 'H': + key = 'Up' + + elif key == 'P': + key = 'Down' + + elif key == 'K': + key = 'Left' + + elif key == 'M': + key = 'Right' + + elif key == 'S': + key = 'Delete' + + elif key == 'R': + key = 'Insert' + + elif key == 'Q': + key = 'PageUp' + + elif key == 'I': + key = 'PageDown' + + elif key == 'G': + key = 'Begin' + + elif key == 'O': + key = 'End' + + elif key == '\x85': + key = 'F11' + + elif key == '\x86': + key = 'F12' + + elif key == '\x00': + + key = getKey() + + if key == ';': + key = 'F1' + + elif key == '<': + key = 'F2' + + elif key == '=': + key = 'F3' + + elif key == '>': + key = 'F4' + + elif key == '?': + key = 'F5' + + elif key == '@': + key = 'F6' + + elif key == 'A': + key = 'F7' + + elif key == 'B': + key = 'F8' + + elif key == 'C': + key = 'F9' + + elif key == 'D': + key = 'F10' + + elif key == '£': + key = 'AltGr+Delete' + + else: + key = COMBI_ALTGR.get(key, key) + + else: + key = COMBI_CTRL.get(key, key) + + return key \ No newline at end of file