我有一个循环,会执行一些工作并将大量信息打印到标准输出(stdout)。因为这是个循环,所以会一遍又一遍地执行。我想做的是,检测用户是否按下键盘上的某个按键(可以是箭头、回车或字母等),并在发生这种情况时执行一些工作。
本次子任务应该很简单,但我已经花了四个小时尝试不同的方法,几乎没有取得实质性进展。
这只需要在Linux系统中工作。
我能找到的最好方法类似于下面这样。但是它只能在0.05秒内捕获到按键。
本次子任务应该很简单,但我已经花了四个小时尝试不同的方法,几乎没有取得实质性进展。
这只需要在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)
return sys.stdin.read(3)
,那么控制台就不再是“非阻塞”的了。 - frnhr