Python 2.7 Python2按键事件回调
我有一个RaspberryPi 3,它将被无头使用,并且用于控制LED,这限制了我使用Python 2。LED几乎是我的设备的唯一输出,一个按键(特别是a中的“w”)是唯一的输入-基本上激活或禁用灯光 我希望在检测到按键事件时调用回调函数,以更改某些状态,但迄今为止我发现的所有可用方法(即从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改变状态的回调函数,因此
/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)]
看
希望这足以让你找到正确的方向