2010-08-19 15 views
14

Ich benutze raw_input in Python mit dem Benutzer in der Shell interagieren.raw_input in Python ohne zu drücken enter

c = raw_input('Press s or n to continue:') 
if c.upper() == 'S': 
    print 'YES' 

Es funktioniert wie vorgesehen, aber der Benutzer muss Enter drücken, nachdem er 's' gedrückt hat. Gibt es eine Möglichkeit, das zu erreichen, was ich von einer Benutzereingabe brauche, ohne die Eingabetaste in der Shell drücken zu müssen? Ich benutze * nixes Maschinen.

+0

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

+0

Siehe diese Seite. Es verwendet das ttyl-Modul und besteht nur aus zwei Zeilen. einfach weglassen die ord() Befehl: http://StackOverflow.com/Questions/575650/How-to-Baint-the-keycodes-in-python – incognick

Antwort

11

Unter Windows müssen Sie das msvcrt Modul, speziell, wie es scheint von der Art und Weise Sie Ihr Problem beschreiben, die Funktion msvcrt.getch:

einen keypress Lesen und senden Sie das resultierende Charakter. Nichts wird an die Konsole zurückgegeben. Dieser Anruf blockiert , wenn ein Tastendruck nicht bereits verfügbar ist, aber nicht auf Enter gedrückt wird.

(usw. - siehe die Dokumente, auf die ich gerade hingewiesen habe). Für Unix siehe z.B. this recipe für eine einfache Möglichkeit, eine ähnliche getch Funktion zu erstellen (siehe auch mehrere Alternativen & c im Kommentar-Thread dieses Rezept).

+0

Es funktioniert wie vorgesehen, und eine plattformübergreifende Lösung ist groß. Danke für die Antwort! –

+0

@Sie sind herzlich willkommen! –

+0

Gehen Sie direkt zu https://pypi.python.org/pypi/readchar, scheint das meiste davon zu tun, obwohl ich es nicht richtig lesen kann, um die Pfeiltasten auf OSX zu lesen. – boxed

8

Python bietet keine Multiplatform-Lösung aus der Box.
Wenn Sie unter Windows sind Sie msvcrt mit versuchen könnte:

import msvcrt 
print 'Press s or n to continue:\n' 
input_char = msvcrt.getch() 
if input_char.upper() == 'S': 
    print 'YES' 
+0

Ich bin auf dieses Modul gestoßen, aber ich brauche es, um an * nixen zu arbeiten. Danke trotzdem! –

3

Anstelle des msvcrt Modul Sie auch WConio verwenden:

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

Auf einer Seite zur Kenntnis, msvcrt.kbhit() gibt ein Boolescher Wert, der bestimmt, ob gerade eine Taste auf der Tastatur gedrückt wird.

Also, wenn Sie ein Spiel oder etwas machen und wollen Tasten drücken, um Dinge zu tun, aber nicht das Spiel vollständig zu stoppen, können Sie kbhit() innerhalb einer if-Anweisung sicherstellen, dass der Schlüssel nur abgerufen wird, wenn der Benutzer tatsächlich möchte etwas tun.

Ein Beispiel in 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

Um ein einzelnes Zeichen zu bekommen, ich habe getch verwendet, aber ich weiß nicht, ob es unter Windows funktioniert.

2

Flüche können das auch tun:

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' 
Verwandte Themen