2010-08-19 3 views
14

Я использую raw_input в Python для взаимодействия с пользователем в оболочке.raw_input в python без нажатия enter

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

Он работает по назначению, но пользователь должен нажать enter в оболочке после нажатия 's'. Есть ли способ выполнить то, что мне нужно от пользовательского ввода, не требуя ввода ввода в оболочку? Я использую * nixes machines.

+0

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

+0

Смотрите эту страницу. Он использует модуль ttyl и имеет только две строки. просто опустите команду ord(): http://stackoverflow.com/questions/575650/how-to-obtain-the-keycodes-in-python – incognick

ответ

11

Под Windows, вам нужен msvcrt модуль, в частности, кажется, от того, как вы описываете вашу проблему, функция msvcrt.getch:

Прочитайте и нажатие возвращает результирующий характер. Ничто не отражается на консоли . Этот вызов будет блокировать , если нажатие клавиши еще не доступно, но не будет ждать нажатия Enter .

(и т.д. - см. Документы, на которые я только что указал). Для Unix см., Например, this recipe для простого способа построения аналогичной функции getch (см. Также несколько альтернатив & c в ветке комментариев этого рецепта).

+0

Работает по назначению, и кросс-платформенное решение отлично. Спасибо за ответ! –

+0

@ Когда-нибудь, пожалуйста! –

+0

Перейдите непосредственно на https://pypi.python.org/pypi/readchar, похоже, что это делается, хотя я не могу заставить его правильно читать клавиши со стрелками на OSX. – boxed

8

Python не предоставляет многоплатформенное решение из коробки.
Если вы на Windows, вы можете попробовать msvcrt с:

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

Я столкнулся с этим модулем, но мне нужно, чтобы он работал над * nixes. Спасибо, в любом случае! –

3

вместо того msvcrt модуля можно также использовать WConio:

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

На стороне записки, msvcrt.kbhit() возвращает boolean значение, определяющее, нажата ли в данный момент клавиша на клавиатуре.

Итак, если вы делаете игру или что-то еще и хотите, чтобы нажатия клавиш делали что-то, но не останавливали игру целиком, вы можете использовать kbhit() внутри оператора if, чтобы убедиться, что ключ извлекается только в том случае, если пользователь фактически хочет что-то сделать.

Пример в 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

Чтобы получить один символ, я использовал getch, но я не знаю, если он работает на Windows.

2

проклятий можно сделать так:

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' 
Смежные вопросы