일부 작업을 수행하고 stdout에 많은 정보를 인쇄하는 루프가 있습니다. 반복해서 (루프입니다 ...) 내가하고 싶은 것은 사용자가 키를 누를 때 (화살표, 입력 또는 문자가 될 수 있음)를 감지하고 그 일이 발생하면 작업을 수행하는 것입니다 .python non-blocking non-messing-my-tty 키 누름 감지
이것은 매우 간단한 서브 서브 태스크 였어 야했지만 지난 4 시간 동안 다른 접근 방식을 시도하고 거의 아무 것도 얻지 못했습니다.
이것은 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
나는 그것이 올바른 방향으로 나를 인도했기 때문에 대답을 받아 들일 것입니다. 감사. 하지만 이스케이프 시퀀스를 지원하지 않기 때문에 제 케이스의 해결책은 아닙니다. select.select는 그 점에 부적합한 것처럼 보입니다. – frnhr