entrée brute en python sans presser enter
j'utilise raw_input
en Python pour interagir avec l'utilisateur dans shell.
c = raw_input('Press s or n to continue:')
if c.upper() == 'S':
print 'YES'
Il fonctionne comme prévu, mais l'utilisateur doit appuyer sur entrer dans le shell après avoir appuyé sur 's'. Y a-t-il un moyen d'accomplir ce dont j'ai besoin à partir d'une entrée utilisateur sans avoir à appuyer sur entrée dans le shell? J'utilise des machines *nixes.
6 réponses
sous Windows, vous avez besoin du msvcrt
module, en particulier, il semble de la façon dont vous décrivez votre problème, la fonction msvcrt.getch:
lire un clavier et retourner le résultant de caractère. Rien n'est fait l'écho pour la console. Cet appel va bloquer si une touche n'est pas déjà disponible, mais n'attendra pas Enter être pressé.
(etc -- voir les docs que j'ai juste fait). Pour Unix, voir par exemple ce recette un moyen simple de construire un semblable getch
fonction (Voir aussi plusieurs alternatives & c dans le fil commentaire de cette recette).
Python ne fournit pas de solution multiplateformes.
Si vous êtes sur Windows, vous pouvez essayer msvcrt avec:
import msvcrt
print 'Press s or n to continue:\n'
input_char = msvcrt.getch()
if input_char.upper() == 'S':
print 'YES'
au Lieu de msvcrt
module vous pouvez également utiliser WConio:
>>> import WConio
>>> ans = WConio.getkey()
>>> ans
'y'
les malédictions peuvent faire cela aussi bien:
import curses, time #-------------------------------------- def input_char(message): try: win = curses.initscr() win.addstr(0, 0, message) while True: ch = win.getch() if ch in range(32, 127): break time.sleep(0.05) except: raise finally: curses.endwin() return chr(ch) #-------------------------------------- c = input_char('Press s or n to continue:') if c.upper() == 'S': print 'YES'
Sur une note de côté, msvcrt.kbhit() renvoie une valeur booléenne déterminant si une touche du clavier est actuellement d'être pressé.
donc si vous faites un jeu ou quelque chose et que vous voulez que les touches fassent des choses mais ne pas arrêter le jeu entièrement, Vous pouvez utiliser kbhit() à l'intérieur d'une instruction if pour vous assurer que la clé n'est récupérée que si l'utilisateur veut réellement faire quelque chose.
un exemple en Python 3:
# this would be in some kind of check_input function
if msvcrt.kbhit():
key = msvcrt.getch().decode("utf-8").lower() # getch() returns bytes data that we need to decode in order to read properly. i also forced lowercase which is optional but recommended
if key == "w": # here 'w' is used as an example
# do stuff
elif key == "a":
# do other stuff
elif key == "j":
# you get the point