【问题标题】:Read multi-character keyboard strokes阅读多字符键盘笔画
【发布时间】:2017-01-23 21:37:43
【问题描述】:

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

系统: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'

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

【问题讨论】:

  • sys.stdin 对此的抽象是错误的。它只是一个包含字节的文件;任何有关产生这些字节的击键的信息都会丢失。您需要直接与键盘进行交互,我认为仅使用标准库是不可能的。
  • 我想这里可能有一个更具体的问题是为什么select.select 没有正确报告sys.stdin 可供阅读?

标签: python python-3.x stdin termios


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 2018-02-06
    相关资源
    最近更新 更多