Я хочу, чтобы мой script подождал, пока пользователь нажмет любую клавишу.
Как это сделать?
Я хочу, чтобы мой script подождал, пока пользователь нажмет любую клавишу.
Как это сделать?
В Python 3 не существует raw_input()
. Итак, просто используйте:
input("Press Enter to continue...")
В Python 2 вы должны использовать raw_input()
, поскольку input(prompt)
эквивалентен eval(raw_input(prompt))
:
raw_input("Press Enter to continue...")
Это только ждет, пока пользователь нажмет ввод, поэтому вы можете использовать msvcrt ((только для Windows/DOS). Модуль msvcrt предоставляет вам доступ к ряду функций в Microsoft Visual C/C++ Runtime Library (MSVCRT) ):
import msvcrt as m
def wait():
m.getch()
Это должно ждать нажатия клавиши.
Один из способов сделать это в 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 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)
Если вы в порядке, в зависимости от системных команд вы можете использовать следующее:
Linux:
os.system('read -s -n 1 -p "Press any key to continue..."')
print
Окна:
os.system("pause")
Просто используя
input("Press Enter to continue...")
вызовет SyntaxError: ожидаемый EOF во время разбора.
Простое использование исправлений:
try:
input("Press enter to continue")
except SyntaxError:
pass
Руководство python предоставляет следующее:
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)
который можно перевернуть в ваш прецедент.
Я не знаю независимого от платформы способа сделать это, но под Windows, если вы используете модуль msvcrt, вы можете использовать его функцию getch:
import msvcrt
c = msvcrt.getch()
print 'you entered', c
mscvcrt также включает неблокирующую функцию kbhit(), чтобы увидеть, был ли нажат ключ без ожидания (не уверен, есть ли соответствующая функция curses). В UNIX есть пакет curses, но не уверен, можете ли вы использовать его, не используя его для всего вывода экрана. Этот код работает под UNIX:
import curses
stdscr = curses.initscr()
c = stdscr.getch()
print 'you entered', chr(c)
curses.endwin()
Обратите внимание, что curses.getch() возвращает порядковый номер нажатой клавиши, чтобы он имел тот же результат, что и я.
Кросс-платформа, код 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/non-blocking, потому что он давал IOError
, и мне это не нужно. Я использую этот код специально, потому что хочу его заблокировать.;)
Я новичок в python, и я уже думал, что я слишком глуп, чтобы воспроизвести самые простые предложения, сделанные здесь. Оказывается, там должна быть ошибка:
Когда python- script выполняется из IDLE, некоторые IO-команды, похоже, ведут себя совершенно иначе (поскольку на самом деле нет окна терминала).
Eg. msvcrt.getch не блокирует и всегда возвращает $ff. Об этом уже сообщалось давно (см., Например, https://bugs.python.org/issue9290) - и он отмечен как фиксированный, так как проблема, похоже, сохраняется в текущих версиях питон /IDLE.
Итак, если какой-либо из вышеперечисленного кода не работает для вас, попробуйте вручную запустить script и NOT из IDLE.
Если вы хотите увидеть, нажали ли они точный ключ (например, "b" ) Сделайте следующее:
while True:
choice = raw_input("> ")
if choice == 'b' :
print "You win"
input("yay")
break
os.system, похоже, всегда вызывает sh, которая не распознает параметры s и n для чтения. Однако команда чтения может быть передана в bash:
os.system("""bash -c 'read -s -n 1 -p "Press any key to continue..."'""")
Если вы хотите подождать ввода (чтобы пользователь, стучавший по клавиатуре, не вызывал непредвиденных ситуаций), используйте
sys.stdin.readline()
или вы могли бы сделать
print("This is a good joke")
print("what happened when the chicken crossed the road")
gap = input("")
if gap == (""):
print("")
else:
print("")
print("it died")