title: Resettable timer in python repeats until cancelled
body: <p>I have copied the code from this webaddress <a href="http://code.activestate.com/recipes/577407-resettable-timer-class-a-little-enhancement-from-p/" rel="nofollow">http://code.activestate.com/recipes/577407-resettable-timer-class-a-little-enhancement-from-p/</a></p>
  
  <p>To create a resettable timer, and it works nicely but once it has finished it ends. I would like to start it again but I'm new and couldn't work out how to do it.</p>
  
  <p>I tired creating a new instance of itself at the bottom of the run() function after the line:</p>
  
  <pre><code>print "Time: %s - timer finished!" % time.asctime()
  </code></pre>
  
  <p>but python didn't seem to like it.</p>
  
  <p>The copy pasted code created by Eddy Jacob is this :</p>
  
  <pre><code>from threading import Thread, Event, Timer
  import time
  
  def TimerReset(*args, **kwargs):
      """ Global function for Timer """
      return _TimerReset(*args, **kwargs)
  
  
  class _TimerReset(Thread):
      """Call a function after a specified number of seconds:
  
      t = TimerReset(30.0, f, args=[], kwargs={})
      t.start()
      t.cancel() # stop the timer's action if it's still waiting
      """
  
      def __init__(self, interval, function, args=[], kwargs={}):
          Thread.__init__(self)
          self.interval = interval
          self.function = function
          self.args = args
          self.kwargs = kwargs
          self.finished = Event()
          self.resetted = True
  
      def cancel(self):
          """Stop the timer if it hasn't finished yet"""
          self.finished.set()
  
      def run(self):
          print "Time: %s - timer running..." % time.asctime()
  
          while self.resetted:
              print "Time: %s - timer waiting for timeout in %.2f..." % (time.asctime(), self.interval)
              self.resetted = False
              self.finished.wait(self.interval)
  
          if not self.finished.isSet():
              self.function(*self.args, **self.kwargs)
          self.finished.set()
          print "Time: %s - timer finished!" % time.asctime()
  
      def reset(self, interval=None):
          """ Reset the timer """
  
          if interval:
              print "Time: %s - timer resetting to %.2f..." % (time.asctime(), interval)
              self.interval = interval
          else:
              print "Time: %s - timer resetting..." % time.asctime()
  
          self.resetted = True
          self.finished.set()
          self.finished.clear()
  </code></pre>
  
  <p>I ran my timer using :</p>
  
  <pre><code>tim = TimerReset(10, AddBlank)
  tim.start()
  </code></pre>
  
  <p>The function AddBlank does something but I would like the timer to be called again but only after it has ended. Really appreciate help with this, I know copying code without understanding it is bad practice but I really just wanted a simple resettable timer to call a function repeatedly unless reset and this almost does that.</p>