1

我正在尝试从嵌入式串行输出中找到一种使用 libavg 事件处理程序的方法。我的理解是,我需要创建自己的 Publisher,我会在处理串行命令时调用它。我所需要的只是一种在给定不同串行输入的情况下创建 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()

来自此处的自定义发布者示例:

class _ButtonBase(avg.DivNode):

    PRESSED = avg.Publisher.genMessageID()
    RELEASED = avg.Publisher.genMessageID()

    def __init__(self, parent=None, **kwargs):
        super(_ButtonBase, self).__init__(**kwargs)
        self.registerInstance(self, parent)
        self.publish(self.PRESSED)
        self.publish(self.RELEASED)

    def _setActiveArea(self, upNode, activeAreaNode, fatFingerEnlarge):
        self.__activeAreaNode = activeAreaNode

        if fatFingerEnlarge:
            if self.__activeAreaNode != None:
                raise(RuntimeError(
                    "Button: Can't specify both fatFingerEnlarge and activeAreaNode"))
            size = upNode.size
            minSize = 20*player.getPixelsPerMM()
            size = avg.Point2D(max(minSize, size.x), max(minSize, size.y))
            self.__activeAreaNode = avg.RectNode(size=size, opacity=0, parent=self)
        else:
            if self.__activeAreaNode == None:
                self.__activeAreaNode = self
            else:
                self.appendChild(self.__activeAreaNode)

        self._tapRecognizer = gesture.TapRecognizer(self.__activeAreaNode,
                possibleHandler=self._onDown, 
                detectedHandler=self._onTap, 
                failHandler=self._onTapFail)
4

1 回答 1

2

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

self.notifySubscribers(Test.PRESSED, [serialID])

在处理程序中:

def onKeyDown(serialID):
    global node
    if serialid == '1':
        node.color = "FF8000"
于 2014-05-17T07:46:12.380 回答