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

现在我正在尝试用一个覆盆子pi和一个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") 

等等。 谢谢。

Solutions Collecting From Web of "在linux机器上检测python 3中按键的最简单方法是什么?"

这是一个简单的循环,将标准输入到原始模式(禁用缓冲,所以你不必按下输入)得到单个字符。 你应该做一些更聪明的事情(就像一个声明来禁用它),但你在这里得到的想法:

 import tty import sys import termios orig_settings = termios.tcgetattr(sys.stdin) tty.setraw(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.setraw来做这tty.setraw ,它会调用linux中的tty驱动来告诉它停止缓冲。 我通过它sys.stdin参数告诉它我想缓冲关闭1 。 所以在tty.setraw调用之后,上面的循环会给出用户按下的每个键的输出。

但是一个复杂的情况是,一旦程序退出,tty仍然处于原始模式。 一般情况下,你会发现这个不令人满意,因为你没有获得任何现代终端设置提供的功能(比如当你使用控制或转义序列时)。 例如,请注意,您可能无法使用ctrl-C退出程序。 因此,读完输入字符后,应将终端重新置于烹饪模式termios.tcsetattr调用只是说“把终端放回我找到的方式”。 它知道如何做到这一点,首先调用termios.tcgetattr在程序开始时说“告诉我所有当前的终端设置”。

一旦你理解了所有这些,你应该能够很容易地将这个功能封装在一个适合你的程序的函数中。

1 stdin是输入来自用户的流。 维基百科可以告诉你更多关于标准流的信息 。

使用一个好的轻量级模块curtsies你可以做这样的事情(从他们的例子/目录中):

 from curtsies import Input def main(): with Input(keynames='curses') as input_generator: for e in input_generator: print(repr(e)) if __name__ == '__main__': main() 

所以按键盘上的键给你这样的东西:

 'a' 's' 'KEY_F(1)' 'KEY_F(2)' 'KEY_F(3)' 'KEY_F(4)' 'KEY_F(5)' 'KEY_LEFT' 'KEY_DOWN' 'KEY_UP' 'KEY_RIGHT' 'KEY_NPAGE' '\n' 

bpython使用curtsies作为与终端有关的东西的低级抽象。

解码输入的基本问题是,在不同的终端和终端仿真器程序(如xtermgnome-terminals物理上相同的密钥会产生不同的密钥序列。 这就是为什么人们需要知道应该使用哪个终端设置来解码输入。 这样的模块有助于从那些血腥的细节中抽象出来。