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.

18
demandé sur Somebody still uses you MS-DOS 2010-08-19 19:07:17

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).

15
répondu Alex Martelli 2010-08-19 15:24:42

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'
9
répondu systempuntoout 2010-08-19 15:29:29

au Lieu de msvcrt module vous pouvez également utiliser WConio:

>>> import WConio
>>> ans = WConio.getkey()
>>> ans
'y'
3
répondu John Howard 2010-08-19 16:13:20

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'
3
répondu user2660966 2016-10-20 12:08:29

Pour obtenir un seul caractère, j'ai utilisé getch

2
répondu Derek Kurth 2016-05-16 00:14:06

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
1
répondu Nytra 2016-02-22 16:58:56