读取多字符键盘笔划
Read multi-character keyboard strokes
我有一个脚本可以读取和处理 python 中的键盘笔画。对于将一个字节发送到 stdin
的标准密钥,这对我来说非常有效。我找不到一种合理的方法来读取产生多字节 ansi 转义码的击键。我需要做什么才能从标准输入读取所有可用数据?
系统:OSX、Python3.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)
Expected/Desired 行为
当我启动脚本并按下右箭头按钮时,我希望输出为:
b'\x1b'
b'['
b'C'
我实际得到的是:
b'\x1b'
如果我再按任何其他键,其他所有内容都会被读取。例如,如果我现在按 'x',我会得到:
b'['
b'C'
b'x'
如何通过初始按键获得所有三个字节?
遇到\x1b
时,等待转义序列的其余部分。然后留一个超时时间,以防用户单独按下 esc。 Vim 这样做,因为这是唯一的方法。
我有一个脚本可以读取和处理 python 中的键盘笔画。对于将一个字节发送到 stdin
的标准密钥,这对我来说非常有效。我找不到一种合理的方法来读取产生多字节 ansi 转义码的击键。我需要做什么才能从标准输入读取所有可用数据?
系统:OSX、Python3.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)
Expected/Desired 行为
当我启动脚本并按下右箭头按钮时,我希望输出为:
b'\x1b'
b'['
b'C'
我实际得到的是:
b'\x1b'
如果我再按任何其他键,其他所有内容都会被读取。例如,如果我现在按 'x',我会得到:
b'['
b'C'
b'x'
如何通过初始按键获得所有三个字节?
遇到\x1b
时,等待转义序列的其余部分。然后留一个超时时间,以防用户单独按下 esc。 Vim 这样做,因为这是唯一的方法。