Как сделать "ударить любой ключ" в 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:
   ...

Благо он покажет пользователю обратный отсчет секунд, очень интересно:)

Другие вопросы по тегам