elements.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import justpy as jp
  2. from contextlib import contextmanager
  3. import asyncio
  4. import time
  5. from utils import handle_exceptions, provide_sender
  6. class Group:
  7. def label(self, text) -> jp.Div:
  8. return jp.Div(text=text, a=self.view, classes='')
  9. def button(self, text, on_click=None) -> jp.Button:
  10. b = jp.Button(text=text, a=self.view, classes='p-2 w-48 bg-blue-700 text-white text-center')
  11. if on_click is not None:
  12. b.on('click', handle_exceptions(provide_sender(on_click, b)))
  13. return b
  14. @contextmanager
  15. def plot(self):
  16. yield
  17. jp.Matplotlib(a=self.view)
  18. @contextmanager
  19. def column(self):
  20. yield Column(self.view)
  21. @contextmanager
  22. def row(self):
  23. yield Row(self.view)
  24. def timer(self, inverval, callback):
  25. async def loop():
  26. while True:
  27. start = time.time()
  28. handle_exceptions(callback)()
  29. jp.run_task(self.view.update())
  30. dt = time.time() - start
  31. await asyncio.sleep(inverval - dt)
  32. jp.run_task(loop())
  33. class Page(Group):
  34. def __init__(self):
  35. self.view = jp.WebPage(delete_flag=False, body_classes='m-4', title='Nice GUI', favicon='favicon.png')
  36. class Column(Group):
  37. def __init__(self, parent_view) -> None:
  38. self.view = jp.Div(a=parent_view, classes='flex flex-col gap-4 items-start')
  39. class Row(Group):
  40. def __init__(self, parent_view) -> None:
  41. self.view = jp.Div(a=parent_view, classes='flex flex-row flex-wrap gap-4 items-start')