现在我正在尝试用树莓派和 makey makey 编写一个小代码。 makey makey 是一块小板,当某些触点通电时可充当 USB 键盘。我的问题是在 python 脚本中检测这些按键的最简单方法是什么。我知道使用 GPIO 引脚会更容易,但现在我正在寻找这个。我已经看到了一些例子,例如使用 msvcrt 中的 getch()(据我了解,它仅适用于 Windows)、使用 pygame.key 和使用 getKey。哪一个论文最容易使用?有没有什么可以检测到按下一个键和释放一个键?
伪代码:
import whatever needs importing
if the "W" key is pressed:
print ("You pressed W")
elif the "S" is pressed:
print ("You pressed S")
等等。谢谢。
原文由 montainz09 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是一个简单的循环,它将 stdin 置于原始模式(禁用缓冲,因此您不必按 enter 键)以获取单个字符。你应该做一些更聪明的事情(比如
with
声明来禁用它)但是你在这里明白了:我认为您必须循环检测 Python 中的密钥发布。
ETA 一些更多的解释:
在 Linux 上,程序的输入将被 行缓冲。这意味着操作系统将缓冲输入直到它有整行,所以你的程序甚至不会看到用户键入的任何内容,直到用户也点击“输入”。换句话说,如果您的程序期望用户键入“w”并且用户执行了此操作,则“w”将位于操作系统的缓冲区中,直到用户点击“enter”。此时整行都被传送到您的程序,因此您将获得字符串“w\n”作为用户的输入。
您可以通过将 tty 置于 原始模式 来禁用它。您使用 Python 函数
tty.setcbreak
执行此操作,它将调用 linux 中的 tty 驱动程序以告诉它停止缓冲。我将sys.stdin
参数传递给它,告诉它我想为1关闭哪个流的缓冲。所以在tty.setcbreak
调用之后,上面的循环将为您提供用户按下的每个键的输出。但是,一个复杂的问题是,一旦您的程序退出,tty 仍处于原始模式。您通常会发现这并不令人满意,因为您没有获得现代终端设置提供的任何功能(例如当您使用控制或转义序列时)。例如,请注意您可能无法使用
ctrl-C
退出程序。因此,您应该在读取完输入字符后将终端重新置于 熟化模式。termios.tcsetattr
电话只是说“把终端放回我找到它的地方”。它知道如何通过首先调用termios.tcgetattr
在程序开头说“告诉我终端的所有当前设置”来做到这一点。一旦理解了所有这些,您应该能够轻松地将功能封装在适合您的程序的函数中。
1
stdin
是用户输入的流。 Wikipedia 可以告诉您更多关于 标准流 的信息。