을 구현하려고합니다. 또한 F1-F12와 화살표 키와 같은 특수 키의 문자 목록을 반환해야합니다. 이러한 특수 키는 시퀀스에서 여러 문자를 생성합니다. 따라서 getch()
은 차단 모드에서 하나의 char을 읽은 다음 입력 버퍼에 여분의 문자가 있는지도 검사해야합니다.리눅스 터미널 버퍼의 여분의 문자 확인
입력 버퍼의 바이트 수를 얻기 위해 termios.FIONREAD과 함께 ioctl
콜을 사용하고 있습니다. 버퍼에 쌓여있는 특별하지 않은 키 누름을 잡아 당기지 만 특수 키의 여분의 기호는 누락됩니다. 두 개의 다른 버퍼가있는 것처럼 보입니다. 누군가가 이것을 설명 할 수 있다면 좋을 것입니다. 중간에
from time import sleep
def getch():
import sys, tty, termios
fd = sys.stdin.fileno()
# save old terminal settings, because we are changing them
old_settings = termios.tcgetattr(fd)
try:
# set terminal to "raw" mode, in which driver returns
# one char at a time instead of one line at a time
#
# tty.setraw() is just a helper for tcsetattr() call, see
# http://hg.python.org/cpython/file/c6880edaf6f3/Lib/tty.py
tty.setraw(fd)
ch = sys.stdin.read(1)
# --- check if there are more characters in buffer
from fcntl import ioctl
from array import array
sleep(1)
buf = array('i', [0])
ioctl(fd, termios.FIONREAD, buf)
print "buf queue: %s," % buf[0],
# ---
finally:
# restore terminal settings. Do this when all output is
# finished - TCSADRAIN flag
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
char = ''
while char != 'q':
char = getch()
print 'sym: %s, ord(%s)' % (char, ord(char))
주 sleep(1)
:
다음은 상호 작용하는 예입니다. 이 두 번째가 만료되기 전에 하나의 키를 누르 경우, 출력 될 것입니다 : 1 초에 입력 (예 : 'asdfg'에 대한) (5) 보통의 키에 대해서는
buf queue: 0, sym: l, ord(108)
, 출력은 다음과 같습니다
buf queue: 4, sym: a, ord(97)
하지만, 하나의 화살표 키, 출력 :
-
:
일반 키 누름이있는 대기열의 4 개 심볼이 삭제되는 이유는 무엇입니까? "원시"터미널 모드로 전환했기 때문입니까? 터미널을 "원시"모드로 두지 않고 다음에 수행 할
getch()
실행을 위해 문자를 유지하는 방법은 무엇입니까?왜
ioctl
단일 특수 키 누름의 버퍼가 비어 있습니까? 해당 문자는 다음 번에getch()
실행을 위해 어디에서 왔습니까? 그들을 확인하는 방법?
buf queue: 0, sym: , ord(27)
buf queue: 0, sym: [, ord(91)
buf queue: 0, sym: D, ord(68)
여기에 두 가지 질문이 있습니다
[파이썬에서 단일 문자 (getch 스타일) 읽기가 Unix에서 작동하지 않음] (http://stackoverflow.com/questions/1052107/reading-a-single-character-getch-style-in- Python-is-not-un-unix) –
복제본에 대해서는 거의 닫지 않습니다. –