Как приостановить цикл одним нажатием клавиши, используя неблокирующий вызов ввода клавиши

Я использую следующий код 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;

person MBL    schedule 23.10.2014    source источник
comment
Взгляните на мой аналогичный вопрос, ответ, кажется, содержит именно то, что вы хотите: /а>   -  person Simon Streicher    schedule 02.11.2014


Ответы (1)


Для этого требуется многопроцессорность или многопоточность, поскольку вы делаете две вещи одновременно: 1. цикл, 2. ввод и установка флага (и вам также необходимо закодировать способ связи между двумя процессами, например словарь диспетчера многопроцессорности http://pymotw.com/2/multiprocessing/communication.html)

Я думаю, что ваш код ничего не делает, пока цикл while не завершится, но не могу сказать, потому что отступ неверен.

person Community    schedule 23.10.2014