如何使用非阻塞键输入调用单键按下暂停循环

时间:2014-10-23 23:19:43

标签: python nonblocking getch

我使用以下python代码,以便程序不断检查单键按下(它类似于unix平台的非阻塞getch()例程)。当按下一个合适的键时,让我们说'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;

1 个答案:

答案 0 :(得分:0)

这需要多处理或线程,因为你同时做两件事:1。循环,2。输入和设置标志(你还必须编写一种方法来在两个进程之间进行通信,如多处理经理字典http://pymotw.com/2/multiprocessing/communication.html

我认为,在while循环结束之前,你的代码什么也没做,但是因为缩进不正确而无法判断。