现在我正在尝试用覆盆子pi制作一个小代码,并且制作一个很棒的代码.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")
等等.谢谢.
这是一个简单的循环,它将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上,对程序的输入将是行缓冲的.这意味着操作系统将缓冲输入,直到它有整行,因此在用户也点击"输入"之前,您的程序甚至不会看到用户键入的任何内容.换句话说,如果您的程序期望用户键入"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
是输入来自用户的流.维基百科可以告诉您有关标准流的更多信息.
使用一个很好的轻量级模块curtsies你可以做这样的事情(取自他们的examples /目录):
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作为终端相关内容的低级抽象.
解码输入的基本问题是在不同的终端和终端仿真器程序中,xterm
或者gnome-terminals
物理上相同的键产生不同的键码序列.这就是为什么需要知道应该使用哪个终端设置来解码输入的原因.这样的模块有助于从那些血腥的细节中抽象出来.