感觉到 Python 中的向上箭头?

Sense up arrow in Python?

我有这个脚本

import sys, os, termios, tty
home = os.path.expanduser("~")
history = []
if os.path.exists(home+"/.incro_repl_history"):
    readhist = open(home+"/.incro_repl_history", "r+").readlines()
    findex = 0
    for j in readhist:
        if j[-1] == "\n":
            readhist[findex] = j[:-1]
        else:
            readhist[findex] = j
        findex += 1
    history = readhist
    del readhist, findex

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

while True:
    try:
        cur = raw_input("> ")
        key = _Getch()
        print key
        if key == "\x1b[A":
            print "\b" * 1000
            print history[0]
        history.append(cur)
    except EOFError:
        sys.stdout.write("^D\n")
        history.append("^D")
    except KeyboardInterrupt:
        if not os.path.exists(home+"/.incro_repl_history"):
            histfile = open(home+"/.incro_repl_history", "w+")
            for i in history:
                histfile.write(i+"\n")
        else:
            os.remove(home+"/.incro_repl_history")
            histfile = open(home+"/.incro_repl_history", "w+")
            for i in history:
                histfile.write(i+"\n")
    sys.exit("")

当运行时,它获取/home/bjskistad/.incro_repl_history的内容,读取行,并删除换行符,然后定义_Getch class/function。然后,它 运行 是脚本的主循环。 trycur 设置为 raw_input()。然后我尝试使用定义的 _Getch class 来感知向上箭头。这是我遇到麻烦的地方。我无法使用 _Getch class 感应到向上箭头。我如何使用当前代码感知向上箭头?

raw_input 函数在 ENTER 之前总是读取一个字符串,而不是单个字符(箭头等)

您需要定义自己的 getch 函数,请参阅:Python read a single character from the user

然后您可以使用 getch` 函数通过循环重新实现 "input" 函数。

下面是一个简单的用法:

while True:
    char = getch()
    if char == '\x03':
        raise SystemExit("Bye.")
    elif char in '\x00\xe0':
        next_char = getch()
        print("special: {!r}+{!r}".format(char, next_char))
    else:
        print("normal:  {!r}".format(char))

在 Windows 下,使用以下键:Hello<up><down><left><right><ctrl+c>,您将得到:

normal:  'H'
normal:  'e'
normal:  'l'
normal:  'l'
normal:  'o'
special: '\xe0'+'H'
special: '\xe0'+'P'
special: '\xe0'+'K'
special: '\xe0'+'M'

所以箭头对应组合字符:"\xe0H".