elements.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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, self)))
  13. return b
  14. @contextmanager
  15. def column(self):
  16. yield Column(self.view)
  17. @contextmanager
  18. def row(self):
  19. yield Row(self.view)
  20. def timer(self, inverval, callback):
  21. async def loop():
  22. while True:
  23. start = time.time()
  24. handle_exceptions(callback)()
  25. jp.run_task(self.view.update())
  26. dt = time.time() - start
  27. await asyncio.sleep(inverval - dt)
  28. jp.run_task(loop())
  29. class Page(Group):
  30. def __init__(self):
  31. self.view = jp.WebPage(delete_flag=False, body_classes='m-4', title='Nice GUI', favicon='favicon.png')
  32. class Column(Group):
  33. def __init__(self, parent_view) -> None:
  34. self.view = jp.Div(a=parent_view, classes='flex flex-col gap-4 items-start')
  35. class Row(Group):
  36. def __init__(self, parent_view) -> None:
  37. self.view = jp.Div(a=parent_view, classes='flex flex-row flex-wrap gap-4 items-start')