python - 在 linux 机器上检测 python 3 中按键的最简单方法是什么?

标签 python linux python-3.x raspberry-pi

现在我正在尝试用树莓派和 makey makey 编写一个小代码。 makey makey 是一 block 小板,当某些触点通电时可充当 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")

等等。谢谢。

最佳答案

这是一个简单的循环,它将 stdin 置于原始模式(禁用缓冲,因此您不必按 enter)来获取单个字符。你应该做一些更聪明的事情(比如 with 声明来禁用它)但你在这里明白了:

import tty
import sys
import termios

orig_settings = termios.tcgetattr(sys.stdin)

tty.setcbreak(sys.stdin)
x = 0
while x != chr(27): # ESC
    x=sys.stdin.read(1)[0]
    print("You pressed", x)

termios.tcsetattr(sys.stdin, termios.TCSADRAIN, orig_settings)    

我认为您必须循环检测 Python 中的 key 释放。

ETA 更多解释:

在 Linux 上,程序的输入将被行缓冲。这意味着操作系统将缓冲输入直到它有整行,所以你的程序甚至不会看到用户键入的任何内容,直到用户也点击“输入”。换句话说,如果您的程序期望用户键入“w”并且用户执行了此操作,则“w”将位于操作系统的缓冲区中,直到用户点击“enter”。此时整行都被传送到您的程序,因此您将获得字符串“w\n”作为用户的输入。

您可以通过将 tty 置于原始模式 来禁用它。您可以使用 Python 函数 tty.setcbreak 执行此操作,该函数将调用 linux 中的 tty 驱动程序以告诉它停止缓冲。我向它传递了 sys.stdin 参数,告诉它我想为 1 关闭哪个流的缓冲。所以在 tty.setcbreak 调用之后,上面的循环将为您提供用户按下的每个键的输出。

但是,一个复杂的问题是,一旦您的程序退出,tty 仍处于原始模式。您通常会发现这并不令人满意,因为您没有获得现代终端设置提供的任何功能(例如当您使用控制或转义序列时)。例如,请注意您可能无法使用 ctrl-C 退出程序。因此,您应该在阅读完输入字符后将终端重新设置为cooked 模式termios.tcsetattr 调用只是说“将终端放回我找到它的位置”。它知道如何通过首先在程序开头调用 termios.tcgetattr 来执行此操作,该程序说“告诉我终端的所有当前设置”。

一旦理解了所有这些,您应该能够轻松地将功能封装到适合您的程序的函数中。

1 stdin 是用户输入的流。维基百科可以告诉你更多关于 standard streams 的信息.

关于python - 在 linux 机器上检测 python 3 中按键的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34497323/

相关文章:

c - 通过串口发送文件

java - 使用通过 apt 安装的 java 库

c - arm-linux-gcc 编译器链接,找不到文件

python - windows 和 linux 中的 subprocess.Popen 和 shlex.split 格式化

python - 允许 python mac 应用程序运行 sudo 脚本

python - 值错误 : scatter requires x column to be numeric

python - 使用 sum 函数时遇到问题

python-3.x - 如何在Python脚本中提取变量而不执行它?

python - 是否可以使用 ItemLoaders 来解析 HTML 节点?

python - spacy-io 如何在没有 GIL 的情况下使用多线程?