Как сделать "ударить любой ключ" в Python?
Как мне сделать "нажать любую клавишу" (или захватить опцию меню) в Python?
- raw_input требует, чтобы вы нажали return.
- В Windows msvcrt есть getch() и getche().
Есть ли портативный способ сделать это, используя стандартные библиотеки?
6 ответов
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
Пару лет назад я написал небольшую библиотеку для кроссплатформенной работы (вдохновленный ответом Джона Милликина выше). В дополнение к 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
или проверить это здесь.
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, хотя. Я не думаю, что есть кроссплатформенный путь.
Я реализовал это в Windows следующим образом. getch()
занимает один единственный символ
import msvcrt
char = 0
print 'Press any key to continue'
while not char:
char = msvcrt.getch()
Другой вариант:
import keyboard
print("Press any key to continue")
keyboard.read_key()
print("to be continued...")
На платформе Linux, я использую os.system
звонить /sbin/getkey
команда, например
continue_ = os.system('/sbin/getkey -m "Please any key within %d seconds to continue..." -c 10')
if continue_:
...
else:
...
Благо он покажет пользователю обратный отсчет секунд, очень интересно:)