是否可以使用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
,请为此做些事,然后重新开始。
答
如果你考虑开发一个完整的游戏,PyGame
也可能是有用的(最终ncurses
)。
getch()
代码片段可以升级为读取箭头键,但是如何区分箭头键的第一个字符和ESC
键?如果用户按ESC
,则所描述的解决方案可能会等待下一次按键。
我没有找到任何解决方案来处理这最后的情况。
这将需要用户按两次箭头键,这不是很友好。 –
不,它不。你用'read(1)'替换'read(3)',接着用if语句来查找'\ x1b',然后'read(2)'来查看按下了什么键。 – SingleNegationElimination
啊,是的。非常有意义。谢谢你,令牌。 –