Как я могу сделать "ударить любую клавишу" (или захватить опцию меню) в Python?
- raw_input требует, чтобы вы нажали return.
- Windows msvcrt имеет getch() и getche().
Есть ли переносимый способ сделать это, используя стандартные библиотеки?
Как я могу сделать "ударить любую клавишу" (или захватить опцию меню) в Python?
Есть ли переносимый способ сделать это, используя стандартные библиотеки?
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)
try:
os.system('pause') #windows, doesn't require enter
except whatever_it_is:
os.system('read -p "Press any key to continue"') #linux
Из 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)
Это работает только для Unix-вариантов. Я не думаю, что есть кросс-платформенный способ.
Несколько лет назад я написал небольшую библиотеку, чтобы сделать это кросс-платформенным способом (на что прямо ответил Джон Милликин). В дополнение к getch
он поставляется с функцией pause
, которая печатает 'Press any key to continue . . .'
:
pause()
Вы также можете указать пользовательское сообщение:
pause('Hit any key')
Если следующий шаг для выхода, он также оснащен функцией удобства, которая вызывает sys.exit(status)
:
pause_exit(status=0, message='Hit any key')
Установить с помощью pip install py-getch
или проверить здесь.
на платформе linux, я использую os.system
для вызова команды /sbin/getkey
, например.
continue_ = os.system('/sbin/getkey -m "Please any key within %d seconds to continue..." -c 10')
if continue_:
...
else:
...
Преимущество в том, что он покажет секундомер для пользователя, очень интересно:)