是否可以使用getch()来获取不同长度的输入?

时间:2011-09-05 17:07:36

标签: python input getch

我已经开始创建一个相对较小的命令行RPG以展示我新发现的Python肌肉,但我已经遇到了一个难题。我正在使用getch()的这个实现:

def getch():
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    tty.setraw(sys.stdin.fileno())
    key = sys.stdin.read(3)
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)

我将key设置为读取3个字符以捕获箭头键。例如,以ESC[A读取;使用此方法,我可以使用key[2]来确定是否按下了箭头键以及哪一个。一切都很好,除了我还想捕获各种其他键; q用于任务日志,wasd用于移动(按各种顺序按箭头将是攻击方法),还有许多其他命令。问题很明显;如果getch()仅返回单个字符,则箭头功能将完全丢失。

如果没有简单的解决方案,我正在考虑完全重新考虑箭头系统,但我几乎肯定必须有。不可否认,我对tty内发生的事情知之甚少,但我在某处读到,如果你只读了1个字符,箭头按下的多余字符将保留在缓冲区中。我怎么去访问所说的缓冲区?或者,是否有一些聪明的方法告诉stdin期望输入可变长度?

提前感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:5)

不要读三个字符。读一个。

如果您刚刚阅读的一个字符是ESC,请阅读另一个或两个字符以查看它是箭头键还是其他任何字符。如果它是q,那就做那件事,然后重新开始。

答案 1 :(得分:0)

如果您考虑开发完整游戏,PyGame也可能有用(最终ncurses)。

可以将getch()代码段升级为读取箭头键,但如何区分箭头键的第一个字符和ESC键之间的差异?如果用户按下ESC,则说明的解决方案可能会等待下一次按键。

我没有找到处理这最后一个案例的任何解决方案。