我使用以下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;
答案 0 :(得分:0)
这需要多处理或线程,因为你同时做两件事:1。循环,2。输入和设置标志(你还必须编写一种方法来在两个进程之间进行通信,如多处理经理字典http://pymotw.com/2/multiprocessing/communication.html)
我认为,在while循环结束之前,你的代码什么也没做,但是因为缩进不正确而无法判断。