当前位置: 首页 > 面试题库 >

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

端木澄邈
2023-03-14
问题内容

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

等等。谢谢。


问题答案:

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



 类似资料:
  • 问题内容: 我有一个使用javascript进行游戏的想法(我将使用EaselJS进行开发),我将不得不检测按键。在互联网上四处浏览后,我看到了很多建议(使用window.onkeypress,使用jQuery等),但是几乎每个选项都有一个反对意见。你们有什么建议?使用jQuery听起来很容易,但实际上我没有使用该库的经验(而且我也不是JavaScript的资深人士),所以我宁愿避免使用它。如果j

  • 问题内容: 是否有可能结合按键的组合来触发单个事件? 我已经在Chrome浏览器中尝试过,但该事件不会触发。 称我为疯狂,但我正在编写Chrome扩展程序,并希望同时按下+ + 键将其强制为隐藏的开发人员模式。 问题答案: 如果要检测的,和钥匙都在同一时间全部下来,你得看都和并保持地图为down的那些的。当他们全都崩溃时,请触发您的事件。 我假设您不关心它们按什么顺序按下(因为要可靠地按一下会很痛

  • 问题内容: 判断用户是否使用移动设备通过PHP浏览我的网站的最简单方法是什么? 我遇到了许多可以使用的类,但是我希望有一个简单的if条件! 有办法吗? 问题答案: 码:

  • 问题内容: cgi.escape似乎是一种可能的选择。它运作良好吗?有什么更好的东西吗? 问题答案: 很好 它逃脱了: 至 至 至 对于所有HTML而言,这就足够了。 编辑:如果您有非ASCII字符,您还想转义,以便包含在使用不同编码的另一个编码文档中,如 Craig 所说,只需使用: 不要忘了解码到第一,使用任何编码它编码的。 但是根据我的经验,如果您从头开始一直都在工作,那么这种编码是没有用的

  • 问题内容: 什么是最好的实践方式得到一个唯一的机器ID 的架构? 除了地址,还有什么好办法吗? 问题答案: 根据您的内核,可以通过sysfs获得DMI信息。试试那些: 或使用工具

  • 问题内容: 我在生产中有20GB +的rdb转储。我怀疑有一组特定的按键使它blo肿。我希望有一种方法可以始终从静态转储分析中发现前100个最大对象,或者将其询问给服务器本身,而服务器本身有7M个对象。 像rdbtools这样的转储分析工具在这个(我认为)非常常见的用例中无济于事! 我当时想编写一个脚本,并使用“ redis-cli调试对象”对整个键集进行迭代,但是我感觉必须缺少某些工具。 问题答