1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
"""GNUmed wx.Timer proxy object.
@copyright: author(s)
"""
############################################################################
# $Source: /home/ncq/Projekte/cvs2git/vcs-mirror/gnumed/gnumed/client/wxpython/gmTimer.py,v $
# $Id: gmTimer.py,v 1.13 2008-12-26 16:04:12 ncq Exp $
__version__ = "$Revision: 1.13 $"
__author__ = "K. Hilbert <Karsten.Hilbert@gmx.net>"
__licence__ = "GPL v2 or later (details at http://www.gnu.org)"
# stdlib
import logging
# 3rd party
import wx
_log = logging.getLogger('gm.timers')
_timers = []
#===========================================================================
def shutdown():
global _timers
_log.info('shutting down %s pending timers', len(_timers))
for timer in _timers:
_log.debug('timer [%s]', timer.cookie)
timer.Stop()
_timers = []
#===========================================================================
class cTimer(wx.Timer):
"""wx.Timer proxy.
It would be quite useful to tune the delay
according to current network speed either at
application startup or even during runtime.
"""
def __init__(self, callback = None, delay = 300, cookie = None):
"""Set up our timer with reasonable defaults.
- delay default is 300ms as per Richard Terry's experience
- delay should be tailored to network speed/user speed
- <cookie> is passed to <callback> when <delay> is up
"""
# sanity check
if not callable(callback):
raise ValueError("[%s]: <callback> %s is not a callable()" % (self.__class__.__name__, callback))
if cookie is None:
self.cookie = id(self)
else:
self.cookie = cookie
self.__callback = callback
self.__delay = delay
wx.Timer.__init__(self)
_log.debug('setting up timer: cookie [%s], delay %sms', self.cookie, self.__delay)
global _timers
_timers.append(self)
#-----------------------------------------------------------------------
def Start(self, milliseconds=-1, oneShot=False):
if milliseconds == -1:
milliseconds = self.__delay
wx.Timer.Start(self, milliseconds=milliseconds, oneShot=oneShot)
#-----------------------------------------------------------------------
def Notify(self):
self.__callback(self.cookie)
#-----------------------------------------------------------------------
def set_cookie(self, cookie=None):
if cookie is None:
self.cookie = id(self)
else:
self.cookie = cookie
#===========================================================================
if __name__ == '__main__':
import time
#-----------------------------------------------------------------------
def cb_timer(cookie):
print "timer <%s> fired" % cookie
#-----------------------------------------------------------------------
class cApp(wx.App):
def OnInit(self):
print "setting up timer"
timer = cTimer(callback = cb_timer)
print "starting timer"
timer.Start()
return True
#-----------------------------------------------------------------------
app = cApp(0)
# and enter the main event loop
app.MainLoop()
print "waiting 10 seconds for timer to trigger"
time.sleep(10)
#===========================================================================
|