Python 2.7 Python2按键事件回调

Python 2.7 Python2按键事件回调,python-2.7,raspberry-pi,keypress,keyboard-events,Python 2.7,Raspberry Pi,Keypress,Keyboard Events,我有一个RaspberryPi 3,它将被无头使用,并且用于控制LED,这限制了我使用Python 2。LED几乎是我的设备的唯一输出,一个按键(特别是a中的“w”)是唯一的输入-基本上激活或禁用灯光 我希望在检测到按键事件时调用回调函数,以更改某些状态,但迄今为止我发现的所有可用方法(即从/dev/input/event0读取)似乎都被阻塞。该模块看起来很有用,但所有异步选项似乎都是Python3 在GPIO python库(在Python2中运行良好)中,有用于pin改变状态的回调函数,因此

我有一个RaspberryPi 3,它将被无头使用,并且用于控制LED,这限制了我使用Python 2。LED几乎是我的设备的唯一输出,一个按键(特别是a中的“w”)是唯一的输入-基本上激活或禁用灯光

我希望在检测到按键事件时调用回调函数,以更改某些状态,但迄今为止我发现的所有可用方法(即从
/dev/input/event0
读取)似乎都被阻塞。该模块看起来很有用,但所有异步选项似乎都是Python3

在GPIO python库(在Python2中运行良好)中,有用于pin改变状态的回调函数,因此我想我希望有一个类似的API用于检测按键事件

代码将在systemd进程中运行,从
/dev/input/event0
读取似乎比从
stdin
中获取有用的按键事件更有可能(它似乎没有连接到systemd进程中检测按键)


(顺便说一句)

输入设备与任何其他文件没有本质上的区别。您可以在其上使用
select()
poll()
(等)来测试输入是否可用。也就是说,考虑到:

import select

dev = open('/dev/input/event4')
p = select.poll()
p.register(dev, select.POLLIN)
我可以通过运行以下命令检查输入是否可用:

events = p.poll(0)
这将返回一个空列表,或者返回一个
(文件描述符,事件)
元组;无论哪种情况,它都不会阻塞。 根据您的代码,您实际上可能希望它阻止 很少;上述调用中的
0
实际上是一个超时(在 毫秒)

在收到有关此文件描述符的
POLLIN
事件后,我知道 我可以
无阻塞地从中读取一些数据。一个完整的例子
可能看起来像:

import os
import select

p = select.poll()
dev = open('/dev/input/event4')
p.register(dev, select.POLLIN)

while True:
    events = p.poll(500)
    if events:
        print 'events:', events
        data = os.read(dev.fileno(), 1024)
        print 'read: %s' % (repr(data))
    else:
      print 'no events...'
这将在循环中调用
poll
,每次睡眠时间长达500毫秒 除非有输入,否则它会立即做出反应

我喜欢
select.poll
,因为api越老越容易
select
打电话,但我注意到 模块包括 安

仔细看看这个例子,实际上您可以传递一个 将设备输入到
轮询
,这样我们可以像这样重写上面的内容:

import os
import select
from evdev import InputDevice

p = select.poll()
dev = InputDevice('/dev/input/event4')

p.register(dev, select.POLLIN)

while True:
    events = p.poll(500)
    if events:
        print 'events:', events
        data = list(dev.read())
        print 'read: %s' % data
请参见输出中的类似内容:

events: [(3, 1)]
read: [InputEvent(1461702764L, 854531L, 4, 4, 458789L), InputEvent(1461702764L, 854531L, 1, 9, 1L), InputEvent(1461702764L, 854531L, 0, 0, 0L)]


希望这足以让您找到正确的方向。

输入设备与任何其他文件没有本质上的区别。您可以在其上使用
select()
poll()
(等)来测试输入是否可用。也就是说,考虑到:

import select

dev = open('/dev/input/event4')
p = select.poll()
p.register(dev, select.POLLIN)
我可以通过运行以下命令检查输入是否可用:

events = p.poll(0)
这将返回一个空列表,或者返回一个
(文件描述符,事件)
元组;无论哪种情况,它都不会阻塞。 根据您的代码,您实际上可能希望它阻止 很少;上述调用中的
0
实际上是一个超时(在 毫秒)

在收到有关此文件描述符的
POLLIN
事件后,我知道 我可以
无阻塞地从中读取一些数据。一个完整的例子
可能看起来像:

import os
import select

p = select.poll()
dev = open('/dev/input/event4')
p.register(dev, select.POLLIN)

while True:
    events = p.poll(500)
    if events:
        print 'events:', events
        data = os.read(dev.fileno(), 1024)
        print 'read: %s' % (repr(data))
    else:
      print 'no events...'
这将在循环中调用
poll
,每次睡眠时间长达500毫秒 除非有输入,否则它会立即做出反应

我喜欢
select.poll
,因为api越老越容易
select
打电话,但我注意到 模块包括 安

仔细看看这个例子,实际上您可以传递一个 将设备输入到
轮询
,这样我们可以像这样重写上面的内容:

import os
import select
from evdev import InputDevice

p = select.poll()
dev = InputDevice('/dev/input/event4')

p.register(dev, select.POLLIN)

while True:
    events = p.poll(500)
    if events:
        print 'events:', events
        data = list(dev.read())
        print 'read: %s' % data
请参见输出中的类似内容:

events: [(3, 1)]
read: [InputEvent(1461702764L, 854531L, 4, 4, 458789L), InputEvent(1461702764L, 854531L, 1, 9, 1L), InputEvent(1461702764L, 854531L, 0, 0, 0L)]

希望这足以让你找到正确的方向