Finding the Values of the Arrow Keys in Python: Why are they triples?
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 \033[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,termiosclass _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 chdef 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()
I am using Mac and I used the following code and it worked well:I got the values for my arrow keys as 0,1,2,3 (Up, Down, Left, Right):Always good to remember code 27 for ESC key too.Best regards!
while True: key = cv2.waitKey(1) & 0xFF # if the 'ESC' key is pressed, Quit if key == 27: quit() if key == 0: print "up" elif key == 1: print "down" elif key == 2: print "left" elif key == 3: print "right" # 255 is what the console returns when there is no key press... elif key != 255: print(key)