Python libavg自定义事件处理程序

Python libavg自定义事件处理程序,python,embedded,raspberry-pi,libavg,Python,Embedded,Raspberry Pi,Libavg,我试图找到一种从嵌入式串行输出中使用libavg事件处理程序的方法。我的理解是,我需要创建自己的发布服务器,在处理串行命令时调用它。所有我需要的是一种方法,创建10个不同的触发器给定不同的串行输入。我尝试做的一个类比就是使用libavg的键盘处理来处理不同的键盘输入 我希望自定义发布服务器获得10个串行输出,并将event.serialid参数传递给各个订阅者,类似于event.keystring所做的操作 这里是一些我拥有的非功能代码,我认为这些代码具有需要完成的基本功能 #!/usr/bin

我试图找到一种从嵌入式串行输出中使用libavg事件处理程序的方法。我的理解是,我需要创建自己的发布服务器,在处理串行命令时调用它。所有我需要的是一种方法,创建10个不同的触发器给定不同的串行输入。我尝试做的一个类比就是使用libavg的键盘处理来处理不同的键盘输入

我希望自定义发布服务器获得10个串行输出,并将event.serialid参数传递给各个订阅者,类似于event.keystring所做的操作

这里是一些我拥有的非功能代码,我认为这些代码具有需要完成的基本功能

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from libavg import avg, statemachine, player

class Test():
    PRESSED = avg.Publisher.genMessageID()
    RELEASED = avg.Publisher.genMessageID()
    def __init__(self, parent=None, **kwargs):
        self.registerInstance(self, parent)
        self.publish(self.PRESSED)
        self.publish(self.RELEASED)
    def isActive(self):
        self.notifySubscribers(Test.PRESSED, [])
    def isInactive(self):
        self.notifySubscribers(Test.RELEASED, [])


def onKeyDown(event):
    global node
    if event.serialid == '1':
        #serialid isn't implemented anywhere but this is what ideally I would like to have happen
        node.color = "FF8000"

def onKeyUp(event):
    global node
    node.color = "FFFFFF" 




player = avg.Player.get()

canvas = player.createMainCanvas(size=(640,480))
rootNode = player.getRootNode()
node = avg.WordsNode(pos=(10,10), font="arial", text="Hello World", parent=rootNode)
vbutton=Test()

node.subscribe(vbutton.PRESSED, onKeyDown)
node.subscribe(vbutton.RELEASED, onKeyUp)


player.play()
自定义发布者的示例来自:


您可以通过发布-订阅接口传递任意参数。参数作为列表传递:

self.notifySubscribers(Test.PRESSED, [serialID])
在处理程序中:

def onKeyDown(serialID):
    global node
    if serialid == '1':
        node.color = "FF8000"

谢谢你的回复,我刚刚有机会测试一下。现在,我在构建测试发布者类时遇到了问题。有关于如何编写的文档吗?self.registerInstance返回“测试实例没有属性‘registerInstance’”,self.publish也会返回同样的结果。您需要从Publisher派生。
def onKeyDown(serialID):
    global node
    if serialid == '1':
        node.color = "FF8000"