当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在linux机器上检测python3中按键的最简单方法是什么?》经验,为你挑选了2个好方法。

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

等等.谢谢.



1> Turn..:

这是一个简单的循环,它将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是输入来自用户的流.维基百科可以告诉您有关标准流的更多信息.



2> user3159253..:

使用一个很好的轻量级模块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物理上相同的键产生不同的键码序列.这就是为什么需要知道应该使用哪个终端设置来解码输入的原因.这样的模块有助于从那些血腥的细节中抽象出来.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有