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

问题描述:

我已经开始创建一个相对较小的命令行RPG来弯曲我的新发现的Python肌肉,但我已经遇到了一个难题。我使用这个实现的getch(的):是否可以使用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期望输入可变长度?

非常感谢您的帮助。

不读取三个字符。阅读一个。

如果您刚刚阅读的一个字符是ESC,请阅读另一个或两个字符以查看它是否为箭头键或其他。如果这是一个q,请为此做些事,然后重新开始。

+0

这将需要用户按两次箭头键,这不是很友好。 –

+0

不,它不。你用'read(1)'替换'read(3)',接着用if语句来查找'\ x1b',然后'read(2)'来查看按下了什么键。 – SingleNegationElimination

+0

啊,是的。非常有意义。谢谢你,令牌。 –

如果你考虑开发一个完整的游戏,PyGame也可能是有用的(最终ncurses)。

getch()代码片段可以升级为读取箭头键,但是如何区分箭头键的第一个字符和ESC键?如果用户按ESC,则所描述的解决方案可能会等待下一次按键。

我没有找到任何解决方案来处理这最后的情况。