-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
271 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |