Source code for ggame.timer
"""
MathApp class for creating periodic and timed callbacks.
"""
from ggame.mathapp import MathApp, _MathDynamic
[docs]class Timer(_MathDynamic):
"""
The Timer class instantiates an object whose basic function is to report
the number of seconds since its creation by calling the object as a
function with an empty argument list.
The Timer class accepts no arguments during creation.
Example of use:
.. literalinclude:: ../examples/timertimer.py
"""
def __init__(self):
super().__init__()
self._once = []
self._callbacks = {}
self._time = 0
self.reset()
MathApp.addDynamic(self) # always dynamically defined
[docs] def reset(self):
"""
Set the reference time to the MathApp current time. If the timer is reset
before the app initializes then do nothing.
:returns: None
"""
self._reset = MathApp.time
@property
def time(self):
"""
Attribute is always updated with the number of seconds since the
timer was created.
"""
return self._time
@time.setter
def time(self, value):
pass
[docs] def step(self):
nexttimers = []
calllist = []
self._time = MathApp.time - self._reset
while self._once and self._once[0][0] <= MathApp.time:
tickinfo = self._once.pop(0)
if tickinfo[1]: # periodic?
nexttimers.append(
(tickinfo[1], self._callbacks[tickinfo][0])
) # delay, callback
calllist.append(
self._callbacks[tickinfo].pop(0)
) # remove callback and queue it
if not self._callbacks[tickinfo]: # if the callback list is empty
del self._callbacks[tickinfo] # remove the dictionary entry altogether
for tickadd in nexttimers:
self.callAfter(tickadd[0], tickadd[1], True) # keep it going
for call in calllist:
call(self)
[docs] def callAfter(self, delay, callback, periodic=False):
"""
Set a callback to occur either once or periodically. The callback
function should accept a single parameter which will be a reference
to the timer object that called it.
:param float delay: The number of seconds to wait before executing
the callback function
:param function callback: The callback function to call on timer
expiration
:param boolean periodic: Set True if the callback function should
be executed periodically
:returns: None
"""
key = (self._time + delay, delay if periodic else 0)
self._once.append(key)
callbacklist = self._callbacks.get(key, [])
callbacklist.append(callback)
self._callbacks[key] = callbacklist
self._once.sort()
[docs] def callAt(self, calltime, callback):
"""
Set a callback to occur at a specific time (seconds since
the Timer object was created or since its
:func:`~ggame.timer.Timer.reset` method was called.
:param float time: The time to wait since timer creation or reset
before calling the callback function.
:param function callback: The callback function to call
:returns: None
"""
self.callAfter(calltime - self._time, callback)
[docs] def callEvery(self, period, callback):
"""
Set a callback to occur periodically. The callback
function should accept a single parameter which will be a reference
to the timer object that called it.
:param float period: The number of seconds to wait before each
execution of the callback function
:param function callback: The callback function to call on timer
expiration
:returns: None
"""
self.callAfter(period, callback, True)
def __call__(self):
return self._time