elements.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. def checkbox(self, text=None, on_change=None) -> jp.Input:
  15. d = jp.Div(a=self.view, classes='flex gap-4')
  16. c = jp.Input(a=d, type='checkbox', classes='form-checkbox mt-1 ml-4')
  17. if text is not None:
  18. jp.Div(text=text, a=d)
  19. if on_change is not None:
  20. c.on('change', handle_exceptions(provide_sender(on_change, c)))
  21. return c
  22. @contextmanager
  23. def plot(self):
  24. yield
  25. jp.Matplotlib(a=self.view)
  26. @contextmanager
  27. def column(self):
  28. yield Column(self)
  29. @contextmanager
  30. def row(self):
  31. yield Row(self)
  32. def timer(self, inverval, callback):
  33. async def loop():
  34. while True:
  35. start = time.time()
  36. handle_exceptions(callback)()
  37. jp.run_task(self.view.update())
  38. dt = time.time() - start
  39. await asyncio.sleep(inverval - dt)
  40. jp.run_task(loop())
  41. class Page(Group):
  42. def __init__(self):
  43. self.view = jp.WebPage(delete_flag=False, body_classes='m-4', title='Nice GUI', favicon='favicon.png')
  44. class Column(Group):
  45. def __init__(self, parent) -> None:
  46. self.parent = parent
  47. self.view = jp.Div(a=parent.view, classes='flex flex-col gap-4 items-start')
  48. class Row(Group):
  49. def __init__(self, parent) -> None:
  50. self.parent = parent
  51. self.view = jp.Div(a=parent.view, classes='flex flex-row flex-wrap gap-4 items-start')