необработанный ввод в python без нажатия enter
Я использую raw_input
в Python для взаимодействия с пользователем в консоли.
c = raw_input('Press s or n to continue:')
if c.upper() == 'S':
print 'YES'
он работает по назначению, но пользователь должен нажать enter в оболочке после нажатия "s". Есть ли способ выполнить то, что мне нужно от пользовательского ввода без необходимости нажимать enter в оболочке? Я использую машины * nixes.
6 ответов
под Windows, вам понадобится msvcrt
модуль, в частности, кажется, из того, как вы описываете свою проблему, функция msvcrt.getch:
прочитайте нажатие клавиши и верните результирующий характер. Ничего не повторяется к консоли. Этот вызов блокирует если клавиши уже не доступно, но не будет ждать ввода чтобы на него надавили.
(etc -- см. документы, на которые я только что указал). Для Unix, см., например,этот рецепт для простого способа построить подобный getch
функция (см. также несколько альтернатив &c в потоке комментариев этого рецепта).
Python не предоставляет мультиплатформенное решение из коробки.
Если вы находитесь в Windows, вы можете попробовать msvcrt С:
import msvcrt
print 'Press s or n to continue:\n'
input_char = msvcrt.getch()
if input_char.upper() == 'S':
print 'YES'
проклятия могут сделать это:
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'
чтобы получить один символ, я использую getch, но я не знаю, работает ли он на Windows.
на боковой ноте, msvcrt.kbhit () возвращает логическое значение, определяющее, нажата ли в данный момент какая-либо клавиша на клавиатуре.
поэтому, если вы делаете игру или что-то еще и хотите, чтобы нажатия клавиш делали что-то, но не останавливали игру полностью, вы можете использовать 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