Quelle est la manière la plus simple de détecter les appuis sur les touches dans python 3 sur une machine Linux?

En ce moment j’essaie de faire un petit code avec un pi de framboise et un makey makey. Le makey makey est un petit tableau qui fait office de clavier USB lorsque certains contacts sont alimentés. Ma question est de savoir quel est le moyen le plus simple de détecter ces touches dans un script python. Je comprends que l’utilisation des broches GPIO serait plus facile, mais je recherche actuellement cette solution. J’ai vu des exemples comme l’utilisation de getch () à partir de msvcrt (qui d’après ce que j’ai compris est uniquement Windows,) en utilisant pygame.key et en utilisant getKey. Laquelle des thèses est la plus facile à utiliser? Existe-t-il des éléments capables de détecter l’appui d’une touche et la libération d’une clé?

Pseudocode Code (… est-ce que c’est ce qu’on appelle?)

import whatever needs importing if the "W" key is pressed: print ("You pressed W") elif the "S" is pressed: print ("You pressed S") 

etc. Merci.

C’est une simple boucle qui mettra stdin en mode brut (désactivation de la mise en mémoire tampon pour ne pas avoir à appuyer sur Entrée) pour obtenir des caractères uniques. Vous devriez faire quelque chose de plus intelligent (comme une instruction with pour le désactiver), mais vous avez l’idée ici:

 import tty import sys import termios orig_settings = termios.tcgetattr(sys.stdin) tty.setraw(sys.stdin) x = 0 while x != chr(27): # ESC x=sys.stdin.read(1)[0] print("You pressed", x) termios.tcsetattr(sys.stdin, termios.TCSADRAIN, orig_settings) 

Je pense que vous devriez faire une boucle pour détecter les versions clés en Python.

ETA plus d’explications:

Sous Linux, les entrées dans votre programme seront mises en mémoire tampon . Cela signifie que le système d’exploitation mettra en mémoire tampon les entrées jusqu’à ce qu’il ait une ligne entière, de sorte que votre programme ne verra même pas ce que l’utilisateur a tapé jusqu’à ce que l’utilisateur clique également sur «Entrée». En d’autres termes, si votre programme s’attend à ce que l’utilisateur tape «w» et que l’utilisateur le fasse, «w» restra dans le tampon du système d’exploitation jusqu’à ce que l’utilisateur clique sur «enter». À ce stade, la ligne entière est livrée à votre programme afin que vous obteniez la chaîne “w \ n” comme entrée de l’utilisateur.

Vous pouvez désactiver ceci en mettant le tty en mode brut . Vous faites cela avec la fonction Python tty.setraw qui appellera le pilote tty dans linux pour lui demander d’arrêter la mise en mémoire tampon. Je l’ai passé l’argument sys.stdin pour lui dire quel stream je voulais désactiver la mise en tampon pour 1 . Donc, après l’appel à tty.setraw , la boucle ci-dessus vous donnera une sortie pour chaque touche sur laquelle l’utilisateur appuie.

Une complication est que, une fois que votre programme se termine, le tty est toujours en mode brut. Vous trouverez généralement cela insatisfaisant, car vous n’obtenez pas la puissance qu’offrent les parameters de terminal modernes (comme lorsque vous utilisez des séquences de contrôle ou d’échappement). Par exemple, notez que vous pourriez avoir des difficultés à quitter le programme avec ctrl-C . Par conséquent, vous devez remettre le terminal en mode cuit une fois que vous avez fini de lire les caractères entrés. L’appel termios.tcsetattr dit simplement “remettez le terminal comme je l’ai trouvé”. Il sait comment faire en appelant tout d’abord termios.tcgetattr au début du programme en disant “dites-moi tous les parameters actuels du terminal”.

Une fois que vous avez compris tout cela, vous devriez pouvoir encapsuler facilement les fonctionnalités dans une fonction adaptée à votre programme.

1 stdin est le stream que l’utilisateur vous envoie. Wikipedia peut vous en dire plus sur les stream standard .

En utilisant un bon module léger, vous pouvez faire quelque chose comme ça (extrait de leur répertoire examples /):

 from curtsies import Input def main(): with Input(keynames='curses') as input_generator: for e in input_generator: print(repr(e)) if __name__ == '__main__': main() 

Donc, en appuyant sur les touches de votre clavier, vous obtenez quelque chose comme ceci:

 'a' 's' 'KEY_F(1)' 'KEY_F(2)' 'KEY_F(3)' 'KEY_F(4)' 'KEY_F(5)' 'KEY_LEFT' 'KEY_DOWN' 'KEY_UP' 'KEY_RIGHT' 'KEY_NPAGE' '\n' 

cursies est utilisé par bpython comme une abstraction de bas niveau des éléments liés aux terminaux.

Le problème de base du décodage de l’entrée est que, dans différents terminaux et programmes d’ xterm tels que xterm ou gnome-terminals les mêmes clés produisent physiquement des séquences de codes clés différentes. C’est pourquoi il faut savoir quels parameters de terminal doivent être utilisés pour décoder les entrées. Un tel module permet de faire abstraction de ces détails évidents.