2009-09-08 4 views
28

Wie würde ich in Python einen "irgendeinen Schlüssel drücken" (oder eine Menüoption wählen)?Wie kann man in Python "einen beliebigen Schlüssel drücken"?

  • raw_input erfordert, dass Sie die Return-Taste drücken.
  • Windows msvcrt hat getch() und getche().

Gibt es einen portablen Weg, dies mit den Standard-Bibliotheken zu tun?

+16

Wo ist der Schlüssel "any"? Ich habe keinen auf meiner Tastatur –

+3

+1 für die offensichtliche Verwendung eines Klischees. –

+2

@Patrick Warum haben Sie nicht die "Eins" -Taste auf Ihrer Tastatur? Rest der Zahlen sind gut? Hast du "1" verloren? Oder finden Sie die Eingabe von "1" über ASCII-Tastenkombinationen angenehm? – AneesAhmed777

Antwort

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

Versuchen Sie, dies von einer IDE unter Linux auszuführen, und Sie erhalten 'termios.error: (22, 'Ungültiges Argument')'. isatty() ist nicht sicher! – sorin

+0

Bedeutet '' termios' 'nicht, dass es von einem Terminal aus ausgeführt wird (ein 'tty' wenn du willst)? –

+1

das wird nicht verschoben/kontrolliert/usw. Kennen Sie auch einen Weg dies zu tun? – Mala

4

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

Dies funktioniert nur für Unix-Varianten though. Ich glaube nicht, dass es einen plattformübergreifenden Weg gibt.

+0

Dies sollte die Lösung sein. –

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 für System ('Pause') – ntcong

+1

+1 für es ist eine einfache Lösung, wahrscheinlich gut genug für 90% aller Fälle. – Rook

+1

muss es eingeben. – nosklo

0

auf Linux-Plattform, verwende ich os.system/sbin/getkey Befehl zu nennen, z.B.

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

Der Vorteil ist es eine Countdown-Sekunden Benutzer zeigen wird, sehr interessant :)

2

Vor ein paar Jahren habe ich eine kleine Bibliothek schrieb dies in einem plattformübergreifende Art und Weise zu tun (inspiriert direkt von John Millikins Antwort oben). Neben getch, es mit einer pause Funktion kommt, die 'Press any key to continue . . .' druckt:

pause() 

Sie eine benutzerdefinierte Nachricht liefern:

pause('Hit any key') 

Wenn der nächste Schritt zu verlassen ist, es kommt auch mit einem Komfortfunktion, die sys.exit(status) ruft:

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

Installieren mit pip install py-getch oder check it out here.

Verwandte Themen