Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lire immédiatement les frappes clavier

comme le raw mode de curses

Sujet résolu
3 décembre 2011 à 12:40:32

Bonjour à tous,
j'aimerais pouvoir lire directement les frappes claviers de l'utilisateurs ( pas comme la fonction input() ou raw_input() par exemple ), afin de rendre le mode console de mon programme plus "dynamique", seulement je ne sais pas comment faire.

Je sais le faire depuis le module "curses" en utilisant la fonction raw() puis la fonction ord() pour tester les frappes seulement je n'aime pas curses car ça me demanderais déjà de réécrire en grande partie mon programme et aussi car curses est très contraignant sur la taille du terminal ( et il crash si le terminal devient trop petit, trop grand ou si le texte dépasse la taille initiale du terminal ... ).

Voilà pourquoi j'aimerais pouvoir le faire d'une autre manière ( plus simple ? ), je sais qu'il existe pyhook pour windows mais mon programme ne tourne que sur linux donc ce n'est pas une solution ...

Merci d'avance !
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
3 décembre 2011 à 13:52:47

Pour linux il y a peut-être la Xlib, pour python, il doit exister une api, faut chercher un peu
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2011 à 17:18:07

sys.stdin.read(1) # trouvé sur SO, pas testé mais ça semble tellement évident en fait que j'ai pas trop de doutes :p
  • Partager sur Facebook
  • Partager sur Twitter
4 décembre 2011 à 21:18:05

Ca ne ressemble pas du tout à ce que je cherche, moi je cherche un équivalent au mode "row" ( combiner avec noecho ) de ncurses de manière à ce que l'appuie d'une touche ( la touche 'a' par exemple ) soit directement enregistré dans un variable ( en hexadecimal ) puis ensuite il est facile de la tester avec ord().

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
4 décembre 2011 à 21:28:48

C'est un peu le genre de getpass, non?
  • Partager sur Facebook
  • Partager sur Twitter
4 décembre 2011 à 21:33:15

En fait getpass ne fait que la moitié du boulot : il n'affiche pas ce que l'utilisateur entre, mais en aucun cas la touche entrée est directement analysée ( en gros getpass c'est l'équivalent de passwd ).

J'ai beaucoup cherché et j'ai vraiment l'impression qu'il n'y a que curses ( que je veux éviter pour les raisons que j'ai dis précédemment ) ou pyhook ( mais c'est l'api windows ).
  • Partager sur Facebook
  • Partager sur Twitter
4 décembre 2011 à 21:46:15

Citation : cerium50

sys.stdin.read(1) # trouvé sur SO, pas testé mais ça semble tellement évident en fait que j'ai pas trop de doutes :p



Tu veux récupérer un caractère tapé au clavier et que celui-ci soit toujours affiché ? Car le code présenté fonctionne :
monChar = ord(sys.stdin.read(1))

Plus d'infos ici : http://oreilly.com/catalog/lpython/chapter/ch09.html

# read character by character
while 1:
    next = sys.stdin.read(1)            # read a one-character string
    if not next:                        # or an empty string at EOF
        break
       Process character 'next'
  • Partager sur Facebook
  • Partager sur Twitter
4 décembre 2011 à 21:55:06

Non tu n'as pas compris, en gros je veux que quand un utilisateurs appuie sur une touche, elle soit testé directement, en gros je veux que ce qui en anglais est appelé "line buffering" soit "off" ( c'est le "raw" mode dans ncurses ), je combine ça avec noecho() ( en gros ce que rentre l'utilisateurs n'est pas affiché sur le screen ) puis je teste ce qu'il rentre ( avec une boucle tant que c'est pas une option qui existe ).

Chaque fois que l'utilisateurs appuie sur un touche, sa valeur hexadecimal est rentrée dans la variable, donc ensuite je teste la nature de la touche appuyée avec ord :
# dans la boucle
if ord('a') == touche_pressee: # test si la touche 'a' a été préssée.
    break


# edit
J'ai vu ton code edité mais ce n'est toujours pas ce que je veux ( deplus ça semble codé avec python2 vu que la dernière ligne me renvoit une erreur.


  • Partager sur Facebook
  • Partager sur Twitter
4 décembre 2011 à 22:06:16

Cela fonctionne !!! Merci à toi !
import msvcrt # je teste depuis windows là 
ch = msvcrt
if ch[0] == ord('a'):
  print("touche a presse !")
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
4 décembre 2011 à 22:08:07

Oui mais msvcrt n'est pas portable!
  • Partager sur Facebook
  • Partager sur Twitter
4 décembre 2011 à 22:30:14

@fred
d'après ton lien il y a l'équivalent linux, mon programme ne fonctionne que sous linux donc aucun problème ^^
je met directement le code ici pour plus de visibilité :
import sys, tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)

#Note : pas testé encore mais d'après le site ça fait pareil que dans mon poste précédent je testerais quand j'aurais ma machine sous linux à portée de main

@serium sys.stdin seul n'est pas suffisant mais si on ne voit pas ce que l'user rentre, l'interet de la solution du site proposé par fred c'est que non seulement on ne voit pas ce qui est rentré même en plus l'utilisateur n'a pas a appuyer sur la touche entrée pour valider sa réponse ce qui permet de faire un programme "reactif".

genre
(A) dosomething (B) exit
  • Partager sur Facebook
  • Partager sur Twitter