Відповіді:
У Python 3 використовуйте input()
:
input("Press Enter to continue...")
У Python 2 використовуйте raw_input()
:
raw_input("Press Enter to continue...")
Це чекає, поки користувач натисне клавішу enter.
Можливо, захочеться використовувати msvcrt ((лише для Windows / DOS) Модуль msvcrt надає вам доступ до ряду функцій у бібліотеці виконання Microsoft Visual C / C ++ (MSVCRT)):
import msvcrt as m
def wait():
m.getch()
Це повинно чекати натискання клавіші.
Додаткова інформація:
в Python 3 raw_input()
не існує
У Python 2 input(prompt)
еквівалентноeval(raw_input(prompt))
input
не продовжується, якщо натиснута будь-яка клавіша, лише якщо натиснута клавіша Enter.
Один із способів зробити це в Python 2 - це використовувати raw_input()
:
raw_input("Press Enter to continue...")
У python3 це просто input()
enter
?
input()
.
У своєму вікні linux я використовую наступний код. Це схоже на код, який я бачив в іншому місці (наприклад, у старих поширених питаннях 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)
Якщо у вас все в порядку, залежно від системних команд, ви можете використовувати наступне:
Linux:
import os
os.system('read -sn 1 -p "Press any key to continue..."')
print
Windows:
import os
os.system("pause")
system
та подзвонити sys.exit(0)
.
Просто за допомогою
input("Press Enter to continue...")
викличе SyntaxError: очікуваний EOF під час розбору.
Просте використання виправлення:
try:
input("Press enter to continue")
except SyntaxError:
pass
input
в python 2 - правильна функція raw_input
. У python 2 input
еквівалентно eval(raw_input())
.
Пітон керівництво містить наступне:
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 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 / unblocking, оскільки він давав IOError
s, і мені це не потрібно. Я використовую цей код спеціально, тому що я хочу його блокувати. ;)
Додаток:
Я реалізував це в пакеті на PyPI з великою кількістю інших смаколиків під назвою консоль :
>>> from console.utils import wait_key
>>> wait_key()
'h'
Я не знаю, як це залежить від платформи, але в Windows, якщо ви використовуєте модуль msvcrt, ви можете використовувати його функцію getch:
import msvcrt
c = msvcrt.getch()
print 'you entered', c
mscvcrt також включає в себе функцію kbhit (), що не блокує, щоб перевірити, чи була натиснута клавіша без очікування (не впевнений, чи є відповідна функція curses). У UNIX є пакет прокльонів, але не впевнений, чи зможете ви використовувати його, не використовуючи його на весь вихідний екран. Цей код працює під UNIX:
import curses
stdscr = curses.initscr()
c = stdscr.getch()
print 'you entered', chr(c)
curses.endwin()
Зауважте, що curses.getch () повертає порядковий рядок натиснутої клавіші так, щоб вона мала той самий вихід, який я повинен був надати.
Якщо ви хочете зачекати на введення (щоб користувач, який стукає клавіатурою, не спричинив щось непередбачене), використовуйте
sys.stdin.readline()
Я новачок у python, і я вже думав, що я занадто дурний, щоб відтворити найпростіші пропозиції, зроблені тут. Виявляється, тут є підводний камінь, який слід знати:
Коли python-скрипт виконується з IDLE, деякі IO-команди, схоже, поводяться зовсім інакше (оскільки насправді немає вікна терміналу).
Напр. msvcrt.getch не блокує і завжди повертає $ ff. Про це вже давно повідомляється (див., Наприклад, https://bugs.python.org/issue9290 ) - і це позначено як виправлене, певна проблема, здається, зберігається в поточних версіях python / IDLE.
Отже, якщо який-небудь з опублікованих вище кодів не працює для вас, спробуйте запустити скрипт вручну, а НЕ з 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..."'""")