Skip to content

Instantly share code, notes, and snippets.

@clayote
Last active August 29, 2015 14:25

Revisions

  1. clayote revised this gist Jul 21, 2015. 1 changed file with 23 additions and 23 deletions.
    46 changes: 23 additions & 23 deletions trigger_decorator.py
    Original file line number Diff line number Diff line change
    @@ -1,31 +1,31 @@
    from kivy.event import EventDispatcher
    from kivy.clock import Clock
    from functools import partial


    # this works fine
    class Burger(EventDispatcher):
    def flip(self, *args):
    pass

    @property
    def _trigger_flip(self):
    if not hasattr(self, '_real_trigger_flip'):
    self._real_trigger_flip = Clock.create_trigger(self.flip)
    return self._real_trigger_flip

    class trigger(object):
    """Make a trigger from a method outside of your class's __init__."""
    def __init__(self, func):
    self.func = func

    # this keeps triggering the method on unexpected objects,
    # including many that shouldn't have the method at all, eg. floats
    def get_trigger(obj, fun):
    n = '_real_trigger_' + fun.__name__
    if not hasattr(obj, n):
    setattr(obj, n, Clock.create_trigger(fun))
    return getattr(obj, n)
    def __get__(self, instance, owner=None):
    if instance is None:
    # EventDispatcher iterates over its attributes before it instantiates.
    # Don't try making any trigger in that case.
    return
    if not hasattr(self, '_trig'):
    self._trig = Clock.create_trigger(
    partial(self.func, instance), 0
    )
    return self._trig

    trigger = lambda fun: property(fget=lambda self: get_trigger(self, fun))

    class Fries(EventDispatcher):
    def fry(self, *args):
    class Salad(EventDispatcher):
    def toss(self, *args):
    pass

    _trigger_fry = trigger(fry)
    _trigger_toss = trigger(toss)

    @trigger
    def _trigger_serve(self, *args):
    # for when a method should only be usable via trigger
    pass
  2. clayote created this gist Jul 21, 2015.
    31 changes: 31 additions & 0 deletions trigger_decorator.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,31 @@
    from kivy.event import EventDispatcher
    from kivy.clock import Clock


    # this works fine
    class Burger(EventDispatcher):
    def flip(self, *args):
    pass

    @property
    def _trigger_flip(self):
    if not hasattr(self, '_real_trigger_flip'):
    self._real_trigger_flip = Clock.create_trigger(self.flip)
    return self._real_trigger_flip


    # this keeps triggering the method on unexpected objects,
    # including many that shouldn't have the method at all, eg. floats
    def get_trigger(obj, fun):
    n = '_real_trigger_' + fun.__name__
    if not hasattr(obj, n):
    setattr(obj, n, Clock.create_trigger(fun))
    return getattr(obj, n)

    trigger = lambda fun: property(fget=lambda self: get_trigger(self, fun))

    class Fries(EventDispatcher):
    def fry(self, *args):
    pass

    _trigger_fry = trigger(fry)