2010-08-19 5 views
14

J'utilise raw_input en Python pour interagir avec l'utilisateur dans shell. Cela fonctionne comme prévu, mais l'utilisateur doit appuyer sur Entrée dans le shell après avoir appuyé sur 's'. Existe-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.raw_input en python sans appuyer sur enter

+0

[http://stackoverflow.com/questions/292095/polling-the-keyboard-in-python](http://stackoverflow .com/questions/292095/polling-the-keyboard-in-python) –

+0

Voir cette page. Il utilise le module ttyl et ne comporte que deux lignes. il suffit d'omettre la commande ord(): http://stackoverflow.com/questions/575650/how-to-obtain-the-keycodes-in-python – incognick

Répondre

11

Sous Windows, vous avez besoin du module msvcrt, plus précisément, il semble de la façon dont vous décrivez votre problème, la fonction msvcrt.getch:

Lire un keypress et retourner le caractère résultant. Rien n'est renvoyé à la console. Cet appel bloquera si une touche n'est pas déjà disponible, mais n'attendra pas pour entrer à appuyer.

(etc - voir les documents que je viens de pointer). Pour Unix, voir par ex. this recipe pour un moyen simple de construire une fonction similaire getch (voir aussi plusieurs alternatives & c dans le fil de commentaire de cette recette).

+0

Cela fonctionne comme prévu, et avoir une solution multiplateforme est super. Merci de répondre! –

+0

@Somebody, vous êtes les bienvenus! –

+0

Aller directement à https://pypi.python.org/pypi/readchar, semble faire la plupart de cela, même si je ne peux pas l'obtenir pour lire correctement les touches fléchées sur OSX. – boxed

8

Python ne fournit pas une solution multiplateforme hors de la boîte.
Si vous êtes sous 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' 
+0

J'ai trouvé ce module, mais j'en ai besoin pour travailler sur * nixes. Merci quand même! –

3

au lieu du module msvcrt vous pouvez également utiliser WConio:

>>> import WConio 
>>> ans = WConio.getkey() 
>>> ans 
'y' 
1

Sur une note de côté, msvcrt.kbhit() retourne une Valeur booléenne déterminant si une touche du clavier est en cours de pressage. Donc, si vous faites un jeu ou quelque chose et que vous voulez que les touches fassent des choses mais n'arrêtent pas complètement le jeu, vous pouvez utiliser kbhit() dans une instruction if pour vous assurer que la clé n'est récupérée que veut 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

Pour obtenir un seul caractère, j'ai utilisé getch, mais je ne sais pas si cela fonctionne sur Windows.

2

malédictions peuvent faire 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' 
Questions connexes