I think I figured it out.
I learned from here that each arrow key is represented by a unique ANSI escape code. Then I learned that the ANSI escape codes vary by system and application: in my terminal, hitting cat
and pressing the up-arrow gives ^[[A
, in C it seems to be 33[A
, etc. The latter part, the [A
, remains the same, but the code for the preceding Escape
can be in hex(beginning with an x), octal (beginning with a 0), or decimal(no lead in number).
Then I opened the python console, and plugged in the triples I had previously received, trying to find their character values. As it turned out, chr(27)
gave x1b
, chr(91)
gave [
, and calling chr
on 65,66,67,68
returned A,B,C,D
respectively. Then it was clear: x1b
was the escape-code!
Then I noted that an arrow key, in ANSI represented as a triple, is of course represented as three characters, so I needed to amend my code so as to read in three characters at a time. Here is the result:
import sys,tty,termios
class _Getch:
def __call__(self):
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(3)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
def get():
inkey = _Getch()
while(1):
k=inkey()
if k!='':break
if k=='x1b[A':
print "up"
elif k=='x1b[B':
print "down"
elif k=='x1b[C':
print "right"
elif k=='x1b[D':
print "left"
else:
print "not an arrow key!"
def main():
for i in range(0,20):
get()
if __name__=='__main__':
main()
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…