Finding the Values of the Arrow Keys in Python: Why are they triples? Finding the Values of the Arrow Keys in Python: Why are they triples? python python

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)