Debounce.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import threading
  2. import time
  3. class Debouncer:
  4. def __init__(self, callback, complete=False, interval=0.5):
  5. self.callback = callback
  6. self.complete_callback = complete
  7. self.interval = interval
  8. self.called_while_running = False
  9. self.called_during_timeout = False
  10. self.timeout_set = False
  11. self.running = False
  12. self.latest_args = []
  13. def call(self, *args):
  14. self.latest_args = args
  15. if(self.timeout_set):
  16. self.called_during_timeout = True
  17. elif(self.running):
  18. self.called_while_running = True
  19. else:
  20. threading.Thread(target=self._timeout).start()
  21. def _timeout(self):
  22. self.timeout_set = True
  23. time.sleep(self.interval)
  24. self.timeout_set = False
  25. if(self.called_during_timeout):
  26. self.called_during_timeout = False
  27. self._timeout()
  28. return
  29. self.running = True
  30. res = self.callback(*self.latest_args)
  31. self.running = False
  32. if(self.called_while_running):
  33. self.called_while_running = False
  34. self._timeout()
  35. elif(self.complete_callback):
  36. self.complete_callback(res)