一尘不染

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

linux

现在,我正在尝试用覆盆子pi和一个makey makey编写一个小代码。该makey
makey是一个小板,当某些触点通电时,它充当usb键盘。我的问题是检测python脚本中这些按键的最简单方法是什么。我知道使用GPIO引脚会更容易,但是现在我正在寻找它。我已经看到了一些示例,例如使用pygame.key和getKey从msvcrt使用getch()(据我所知仅是Windows)。哪个论文最容易使用?有没有什么可以检测到按键被按下和按键被释放的?

伪代码(…就是所谓的吗?)

import whatever needs importing

if the "W" key is pressed:
   print ("You pressed W")

elif the "S" is pressed:
    print ("You pressed S")

等等。谢谢。


阅读 384

收藏
2020-06-03

共1个答案

一尘不染

这是一个简单的循环,它将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中的关键版本。

ETA更多的解释:

在Linux上,程序的输入将被 行缓冲 。这意味着操作系统将缓冲输入直到它整行,因此您的程序甚至在用户也按下“
enter”之前都看不到用户键入的任何内容。换句话说,如果您的程序期望用户键入“ 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是来自用户的输入流。维基百科可以告诉您更多有关标准流的信息

2020-06-03