2009-09-08 2 views
28

Как я могу «нажать любую клавишу» (или получить опцию меню) в Python?Как сделать «ударить любую клавишу» в python?

  • raw_input требует от вас возврата.
  • Windows msvcrt имеет getch() и getche().

Есть ли переносной способ сделать это, используя стандартные библиотеки?

+16

Где находится «любой» ключ? У меня нет на клавиатуре –

+3

+1 для очевидного использования клише. –

+2

@Patrick Почему у вас нет «одной» клавиши на клавиатуре? Остальные номера в порядке? Вы потеряли «1»? Или вы находите ввод «1» с помощью комбинаций клавиш ASCII приятным? – AneesAhmed777

ответ

31
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) 
+0

Попробуйте запустить это из IDE в Linux, и вы получите 'termios.error: (22, 'Invalid argument')'. isatty() небезопасно! – sorin

+0

Не означает, что 'termios' подразумевает, что он запускается с терминала (' tty', если хотите)? –

+1

это не получает shift/control/и т. Д. Знаете ли вы, как это сделать? – Mala

4

От 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 варианты, хотя. Я не думаю, что есть кросс-платформенный способ.

+0

Это должно быть решение. –

9
try: 
    os.system('pause') #windows, doesn't require enter 
except whatever_it_is: 
    os.system('read -p "Press any key to continue"') #linux 
+0

-1 для системы ('pause') – ntcong

+1

+1 для этого простого решения, вероятно, достаточно хорошего для 90% всех случаев. – Rook

+1

ему нужно ввести. – nosklo

0

на платформе Linux, я использую os.system вызвать /sbin/getkey команду, например,

continue_ = os.system('/sbin/getkey -m "Please any key within %d seconds to continue..." -c 10') 
if continue_: 
    ... 
else: 
    ... 

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

2

Пару лет назад я написал небольшую библиотеку, чтобы сделать это в кросс-платформенной способ (вдохновленный непосредственно от Иоанна Ответ Милликина выше). В дополнение к 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 или check it out here.

Смежные вопросы