Python ожидать нажатия клавиши

Как заставить Python ждать нажатой клавиши?

Я хочу, чтобы мой скрипт ждал, пока пользователь нажмет любую клавишу.

В Python 3 используйте input() :

input("Press Enter to continue. ")

В Python 2 используйте raw_input() :

raw_input("Press Enter to continue. ")

Это только ждет, пока пользователь нажмет ввод.

Кто-то может захотеть использовать msvcrt ((только для Windows / DOS) Модуль msvcrt предоставляет вам доступ к ряду функций в библиотеке времени выполнения Microsoft Visual C / C ++ (MSVCRT)):

import msvcrt as m def wait(): m.getch()

Это должно ждать нажатия клавиши.

в питоне 3 raw_input() не существует

В Python 2 input(prompt) эквивалентно eval(raw_input(prompt))

Я получаю эту ошибку, когда пытаюсь сделать это в Python 2.7: «SyntaxError: неожиданный EOF при синтаксическом анализе»

@ Solarsaturn9 и все большее и большее количество не делают. Таким образом, этот ответ не работал для меня и многих других, которые приходят сюда.

@richard с использованием input () должен работать и на других платформах. Смешно ставить точки за предоставление альтернативного решения только для Windows, когда первое решение является мультиплатформенным.

@ Solarsaturn9 прочитайте вопрос и ответьте снова: input не продолжается, если нажата какая-либо клавиша, только если нажата кнопка ввода.

@JonTirsen потому что в Python 2.7 есть функция input, которая оценивает введенную вами строку. Чтобы исправить, используйте raw_input

Один из способов сделать это в Python 2, это использовать raw_input() :

raw_input("Press Enter to continue. ")

В python3 это просто input()

На моем компьютере с Linux я использую следующий код. Это похоже на код, который я видел в другом месте (например, в старых FAQ по Python), но этот код вращается в узком цикле, где этого кода нет, и существует множество странных угловых случаев, которые код не учитывает код делает.

def read_single_keypress(): """Waits for a single keypress on stdin. This is a silly function to call if you need to do it a lot because it has to store stdin's current setup, setup stdin for reading single keystrokes then read the single keystroke then revert stdin back after reading the keystroke. Returns a tuple of characters of the key that was pressed - on Linux, pressing keys like up arrow results in a sequence of characters. Returns ('\x03',) on KeyboardInterrupt which can happen when a signal gets handled. """ import termios, fcntl, sys, os fd = sys.stdin.fileno() # save old state flags_save = fcntl.fcntl(fd, fcntl.F_GETFL) attrs_save = termios.tcgetattr(fd) # make raw - the way to do this comes from the termios(3) man page. attrs = list(attrs_save) # copy the stored version to update # iflag attrs[0] &= ~(termios.IGNBRK | termios.BRKINT | termios.PARMRK | termios.ISTRIP | termios.INLCR | termios. IGNCR | termios.ICRNL | termios.IXON ) # oflag attrs[1] &= ~termios.OPOST # cflag attrs[2] &= ~(termios.CSIZE | termios. PARENB) attrs[2] |= termios.CS8 # lflag attrs[3] &= ~(termios.ECHONL | termios.ECHO | termios.ICANON | termios.ISIG | termios.IEXTEN) termios.tcsetattr(fd, termios.TCSANOW, attrs) # turn off non-blocking fcntl.fcntl(fd, fcntl.F_SETFL, flags_save & ~os.O_NONBLOCK) # read a single keystroke ret = [] try: ret.append(sys.stdin.read(1)) # returns a single character fcntl.fcntl(fd, fcntl.F_SETFL, flags_save | os.O_NONBLOCK) c = sys.stdin.read(1) # returns a single character while len(c) > 0: ret.append(c) c = sys.stdin.read(1) except KeyboardInterrupt: ret.append('\x03') finally: # restore old state termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save) fcntl.fcntl(fd, fcntl.F_SETFL, flags_save) return tuple(ret)

Ctrl-C является ASCII 3, так что это ожидается. Если вы хотите поднять сигнал с помощью ctrl-c, простое решение состоит в том, чтобы поместить if ord (return_value) == 3: os.kill (os.getpid (), signal.SIGINT), но вы также можете отключить обработку сигналов. от attrs [0] | = termios.BRKINT, attrs [3]! = termios.ISIG и избавьтесь от обработки, кроме KeyboardInterrupt. Примечание. Я изменил возвращаемое значение KeyboardInterrupt на ‘\ x03’ в честь вашего запроса (и потому что этот код всегда возвращает строку).

Как можно изменить приведенный выше код так, чтобы он возвращал кортеж для сложного нажатия клавиш, например «Page Up» или «Стрелка влево»?

Если у вас все в порядке в зависимости от системных команд, вы можете использовать следующее:

import os os.system('read -sn 1 -p "Press any key to continue. "') print

Если вы хотите продолжать работать до тех пор, пока не будет подан сигнал (например, SIGINT), вы также можете проверить возвращаемое значение из, system а затем вызвать sys.exit(0) .

input("Press Enter to continue. ")

вызовет синтаксическую ошибку: ожидаемый EOF при разборе.

Простое исправление использования:

try: input("Press enter to continue") except SyntaxError: pass

Не используйте input в Python 2 — правильная функция raw_input . В Python 2 input эквивалентно eval(raw_input()) .

Это игнорирует все клавиши, которые нажимает пользователь, до тех пор, пока они не нажмут клавишу ввода, что весьма отличается от того, что запрашивает OP.

Кроме того, если вы собираетесь использовать ‘input’, перехват SyntaxError не подходит. Независимо от того, какие типы пользователей оцениваются, поэтому, например, если они набирают «1/0», то вместо SyntaxError возникает ZeroDivisionError, и ваша программа завершает работу.

Как упомянул @Blorgbeard, достаточно просто использовать raw_input («Нажмите Enter, чтобы продолжить . »). Я использую это часто сейчас при отладке.

Питон руководство содержит следующее:

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", repr(c) except IOError: pass finally: termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm) fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)

который может быть свернут в ваш случай использования.

Хорошей практикой является копирование того, на что вы ссылаетесь, чтобы знания оставались, даже если ссылка умирает (а они делают!).

Как я могу заставить это работать в Python 3.x? В 3.x после изменения оператора печати на совместимость он просто зацикливается и не ждет ввода. Это прекрасно работает в Python 2, хотя.

Кроссплатформенность, код Python 2/3:

# import sys, os def wait_key(): ''' Wait for a key press on the console and return it. ''' result = None if os.name == 'nt': import msvcrt result = msvcrt.getch() else: import termios 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) try: result = sys.stdin.read(1) except IOError: pass finally: termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm) return result

Я удалил fctl / неблокирующий материал, потому что он давал IOError s, и мне это не нужно. Я использую этот код специально, потому что я хочу его заблокировать. 😉

Я реализовал это в пакете на PyPI с множеством других вкусностей, называемых консолью :

>>> from console.utils import wait_key >>> wait_key() 'h'

Источник

Ожидание нажатия клавиши в Python

При программировании на Python порой возникает необходимость приостановить выполнение программы до тех пор, пока пользователь не нажмёт какую-либо клавишу. Классическим примером может быть игра или приложение, где необходимо дождаться реакции пользователя, чтобы продолжить выполнение кода.

Существуют различные способы реализации этого функционала в Python. Однако, стоит отметить, что некоторые из них могут работать только в определенных операционных системах.

Использование модуля msvcrt (только для Windows)

В операционной системе Windows можно использовать модуль msvcrt . Этот модуль предоставляет доступ к различным полезным функциям и переменным, доступным в стандартной библиотеке Microsoft Visual C Runtime. Для ожидания нажатия клавиши в коде Python можно использовать функцию msvcrt.getch() .

import msvcrt print("Ожидание нажатия клавиши. ") msvcrt.getch() print("Клавиша нажата!")

Использование модуля keyboard

Универсальным решением и для Windows, и для Unix-подобных систем (Linux, MacOS) является использование стороннего модуля keyboard . Этот модуль позволяет управлять клавиатурой, не зависимо от операционной системы. Для ожидания нажатия клавиши можно использовать функцию keyboard.read_key() .

import keyboard print("Ожидание нажатия клавиши. ") keyboard.read_key() print("Клавиша нажата!")

Перед использованием модуля keyboard необходимо установить его. Это можно сделать с помощью команды pip install keyboard в командной строке.

Использование модуля getch

Еще одним универсальным решением является использование модуля getch . Этот модуль предоставляет единую функцию getch.getch() , которая читает один символ с клавиатуры, не требуя нажатия Enter.

import getch print("Ожидание нажатия клавиши. ") getch.getch() print("Клавиша нажата!")

Подобно модулю keyboard , модуль getch также не входит в стандартную библиотеку Python и перед использованием его необходимо установить с помощью команды pip install getch в командной строке.

Используя эти методы, можно легко реализовать ожидание нажатия клавиши в Python.

Источник

Читайте также:  Read google sheets java
Оцените статью