2009-09-08 12 views
28

Come faccio a "colpire qualsiasi tasto" (o prendere un'opzione di menu) in Python?Come fare "premere un tasto qualsiasi" in python?

  • raw_input richiede il ritorno.
  • Windows msvcrt ha getch() e getche().

C'è un modo portatile per farlo utilizzando le librerie standard?

+16

Dov'è il tasto "qualsiasi"? Non ne ho uno sulla tastiera –

+3

+1 per l'uso ovvio di un cliché. –

+2

@Patrick Perché non hai il tasto "uno" sulla tastiera? Il resto dei numeri va bene? Hai perso "1"? O trovi divertente entrare in "1" tramite combinazioni di tasti ASCII? – AneesAhmed777

risposta

31
try: 
    # Win32 
    from msvcrt import getch 
except ImportError: 
    # UNIX 
    def getch(): 
     import sys, tty, termios 
     fd = sys.stdin.fileno() 
     old = termios.tcgetattr(fd) 
     try: 
      tty.setraw(fd) 
      return sys.stdin.read(1) 
     finally: 
      termios.tcsetattr(fd, termios.TCSADRAIN, old) 
+0

Prova a eseguire questo da un IDE sotto linux e otterrai 'termios.error: (22, 'Argomento non valido')'. isatty() non è sicuro! – sorin

+0

Non 'termios' implica che sia eseguito da un terminale (un' tty' se vuoi)? –

+1

questo non ha mai cambiato/controllo/ecc. Sai anche come fare? – Mala

4

Dal python docs:

import termios, fcntl, sys, os 
fd = sys.stdin.fileno() 

oldterm = termios.tcgetattr(fd) 
newattr = termios.tcgetattr(fd) 
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO 
termios.tcsetattr(fd, termios.TCSANOW, newattr) 

oldflags = fcntl.fcntl(fd, fcntl.F_GETFL) 
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK) 

try: 
    while 1: 
     try: 
      c = sys.stdin.read(1) 
      print "Got character", `c` 
     except IOError: pass 
finally: 
    termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm) 
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags) 

Questo funziona solo per varianti di Unix però. Non penso ci sia un modo multipiattaforma.

+0

Questa dovrebbe essere la soluzione. –

9
try: 
    os.system('pause') #windows, doesn't require enter 
except whatever_it_is: 
    os.system('read -p "Press any key to continue"') #linux 
+0

-1 per sistema ('pause') – ntcong

+1

+1 perché è una soluzione semplice, probabilmente abbastanza buona per il 90% di tutti i casi. – Rook

+1

ha bisogno di entrare. – nosklo

0

sulla piattaforma Linux, io uso os.system chiamare /sbin/getkey comando, ad esempio

continue_ = os.system('/sbin/getkey -m "Please any key within %d seconds to continue..." -c 10') 
if continue_: 
    ... 
else: 
    ... 

Il vantaggio è che vi mostrerà un conto alla rovescia secondi per utente, molto interessante :)

2

Un paio di anni fa ho scritto una piccola biblioteca per fare questo in modo cross-platform (ispirato direttamente da John La risposta di Millikin sopra). Oltre a getch, si tratta di una funzione pause che stampa 'Press any key to continue . . .':

pause() 

è possibile fornire un messaggio personalizzato troppo:

pause('Hit any key') 

Se il passo successivo è quello di uscire, si tratta anche con un funzione di convenienza che chiama sys.exit(status):

pause_exit(status=0, message='Hit any key') 

installazione con pip install py-getch, o check it out here.

Problemi correlati