binding.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from typing import Any
  2. import asyncio
  3. class Binding:
  4. all_bindings = []
  5. def __init__(self, element, element_attribute: str, model: Any, model_attribute: str) -> None:
  6. self.element = element
  7. self.element_attribute = element_attribute
  8. self.model = model
  9. self.model_attribute = model_attribute
  10. def get_model_value(self):
  11. if isinstance(self.model, dict):
  12. return self.model[self.model_attribute]
  13. else:
  14. return getattr(self.model, self.model_attribute)
  15. def set_model_value(self, value):
  16. if isinstance(self.model, dict):
  17. self.model[self.model_attribute] = value
  18. else:
  19. setattr(self.model, self.model_attribute, value)
  20. async def update_element(self):
  21. model_value = self.get_model_value()
  22. element_value = getattr(self.element, self.element_attribute)
  23. if element_value != model_value:
  24. setattr(self.element, self.element_attribute, model_value)
  25. await self.element.parent_view.update()
  26. def update_model(self):
  27. model_value = self.get_model_value()
  28. element_value = getattr(self.element, self.element_attribute)
  29. if model_value != element_value:
  30. self.set_model_value(element_value)
  31. @staticmethod
  32. async def loop():
  33. while True:
  34. for binding in Binding.all_bindings:
  35. await binding.update_element()
  36. await asyncio.sleep(0.1)