Skip to content

Commit

Permalink
Envoie du code.
Browse files Browse the repository at this point in the history
  • Loading branch information
4surix committed Aug 15, 2020
1 parent 7e4bd88 commit aa51ede
Show file tree
Hide file tree
Showing 2 changed files with 271 additions and 2 deletions.
74 changes: 72 additions & 2 deletions README.md
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) |
199 changes: 199 additions & 0 deletions keypress.py
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

0 comments on commit aa51ede

Please sign in to comment.