读取多字符键盘敲击

时间:2016-07-20 20:01:37

标签: python python-3.x stdin termios

我有一个脚本来读取和处理python中的键盘笔划。对于发送一个字节到stdin的标准密钥,这对我来说非常合适。我找不到合理的方法来读取产生多字节ansi转义码的击键。我需要做什么才能从stdin读取所有可用数据?

系统:OSX,Python 3.4

这是我的最小示例代码:

import sys
import termios
import select

# Save the terminal settings
fd = sys.stdin.fileno()
new_term = termios.tcgetattr(fd)
old_term = termios.tcgetattr(fd)

# New terminal setting unbuffered
new_term[3] = (new_term[3] & ~termios.ICANON & ~termios.ECHO)
termios.tcsetattr(fd, termios.TCSAFLUSH, new_term)

while sys.stdin in select.select([sys.stdin], [], [], 10.0)[0]:
    char = sys.stdin.buffer.read(1)
    print('User input: {}'.format(char))

    if char == b'q':
        break

termios.tcsetattr(fd, termios.TCSAFLUSH, old_term)


预期/期望的行为

当我启动脚本并按下右箭头按钮时,我希望输出为:

b'\x1b'
b'['
b'C'

我实际得到的是:

b'\x1b'

如果我再按任何其他键,其他所有内容都会被读取。例如,如果我现在按下' x'我明白了:

b'['
b'C'
b'x'

如何通过按下初始键来获取所有三个字节?

1 个答案:

答案 0 :(得分:1)

遇到\x1b时,请等待转义序列的其余部分。然后保持超时,以防用户单独按下esc。 Vim这样做,因为这是唯一的方法。