Я использую следующий код Python, чтобы программа постоянно проверяла нажатие одной клавиши (это похоже на неблокирующую процедуру getch() для платформ Unix). Когда нажимается соответствующая клавиша, скажем, клавиша «p», я хочу, чтобы цикл останавливался. Я пытаюсь добиться этого, используя команду raw_input, чтобы приостановить цикл после регистрации клавиши «p». Однако кажется, что цикл продолжается без пауз, даже несмотря на наличие команды raw_input. Я проверил это, добавив счетчик, который печатает прошедшее время на экране каждую секунду - когда цикл возобновляется, счетчик переходит вперед на длительность, равную длительности паузы, вместо того, чтобы оставаться там, где он остановился до паузы. Я не уверен, что я делаю неправильно... любая помощь очень ценится.
import termios, fcntl, sys, os
import sys
import select
import time
starttime=time.time()
counter=1
pauseflag=0;
while True:
if time.time()-starttime>=counter:
print"Seconds elapsed:", counter
counter=counter+1
try:
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)
pausekey = sys.stdin.read(1)
if pausekey=='p':
print"Loop paused"
pauseflag=1
except IOError: pass
finally:
termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
if pauseflag==1:
raw_input("Press ENTER to resume loop.") #pause program indefinitely until user hits enter key
pauseflag=0;