我有一个循环,它做一些工作,并将很多信息打印到stdout。一次又一次地(这是一个循环…)我想做的是检测用户何时/是否按下一个键(可以是箭头、回车或字母),并在这种情况下做一些工作。在
这应该是一个非常简单的子任务,但我在过去的四个小时里尝试了不同的方法,但几乎一无所获。在
这只需要在Linux下工作。在
我能得到的最好的就是下面这样的东西。但这部分是有效的,只有在0.05
秒内才能捕获密钥。在
import sys,tty,termios
class _Getch:
def __call__(self, n=1):
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(n)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
def getch(timeout=0.2):
inkey = _Getch()
k = ''
start_sec = time()
while(time() - start_sec < timeout):
if k == '':
k = timeout_call(inkey, timeout_duration=timeout - (time() - start_sec))
if k == u'\x1b':
k += inkey(2)
if k == u'\x1b[A':
return "up"
if k == u'\x1b[B':
return "down"
if k == u'\x1b[C':
return "right"
if k == u'\x1b[D':
return "left"
elif k == "q":
return 'q'
elif k == "\n":
return 'enter'
else:
return None
while True:
do_some_work_that_lasts_about_0_2_seconds()
key = getch(0.05)
if key:
do_something_with_the(key)
这是我想出的解决办法。不是完美的,因为它依赖于超时,有时如果按mili键(micro?纳米?)超时过期前的秒数。但这是我能想出的最不坏的解决办法。令人失望。。。在
用法:
^{pr2}$以前有人问过这个问题。有人发布了一个漂亮的、简短的、经过重构的solution
转载于此
相关问题 更多 >
编程相关推荐