箭头键如何与getch一起使用? (他们注册为3键)

时间:2014-04-02 17:11:11

标签: python

我正在使用getch代码from this stack overflow question,我写了以下脚本:

getch = _Getch()
while(1):
   test = getch()
   if test == 'm':
      break
   else:
      print ord(test)

如您所见,它打印每个输入的ascii值。所以示例输出如下所示,其中>>>代表我的意见:

>>>a
97
>>>ctrl-c
3
>>>Esc
27

到目前为止一切顺利,但是当我按箭头键时,它给了我:

>>>(Left arrow)
27
91
66
>>>(right arrow)
27
91
67

所以我可以看到27是escape char,但是91是什么? 66和67必须是此的子值。

我正在寻找值,以便我可以实现它们以使用箭头移动光标。我如何在if charvalue ==场景中使用它?

1 个答案:

答案 0 :(得分:0)

您还可以使用select,tty和termios的组合。

import sys, select, tty, termios

class NonBlockingConsole(object):
    def __enter__(self):
        self.old_settings = termios.tcgetattr(sys.stdin)
        tty.setcbreak(sys.stdin.fileno())
        return self

    def __exit__(self, type, value, traceback):
        termios.tcsetattr(sys.stdin, termios.TCSADRAIN, self.old_settings)

    def get_data(self):
        try:
            if select.select([sys.stdin], [], [], 0) == ([sys.stdin], [], []):
                return sys.stdin.read(1)
        except KeyboardInterrupt:
            return '[CTRL-C]'
        return False

with NonBlockingConsole() as nbc:
    while 1:
        c = nbc.get_data()
        if c:
            c = c.decode('latin-1', 'replace')
            if c == '\x1b': # x1b is ESC
                break
            elif c in ('\x7f', '\x08'): # backspace
                pass
            elif c == '[CTRL-C]':
                pass
            elif c == '\n': # it's RETURN
                pass
            else:
                print('Pushed:',c)
        sleep(0.025)

Havn暂时对它进行了测试,目前我在Windows机器上进行测试,但它也可以捕获箭头键(应该)。