nicegui.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #!/usr/bin/env python3
  2. import justpy as jp
  3. import uvicorn
  4. import sys
  5. import inspect
  6. import webbrowser
  7. from pygments.formatters import HtmlFormatter
  8. import binding
  9. import asyncio
  10. from .ui import Ui
  11. from .timer import Timer
  12. from .elements.element import Element
  13. # start uvicorn with auto-reload; afterwards the auto-reloaded process should not start uvicorn again
  14. if not inspect.stack()[-2].filename.endswith('spawn.py'):
  15. webbrowser.open('http://localhost/')
  16. uvicorn.run('nicegui:app', host='0.0.0.0', port=80, lifespan='on', reload=True)
  17. sys.exit()
  18. wp = jp.QuasarPage(delete_flag=False, title='NiceGUI', favicon='favicon.png')
  19. wp.tailwind = True # use Tailwind classes instead of Quasars
  20. wp.css = HtmlFormatter().get_style_defs('.codehilite')
  21. wp.css += ''.join([f'h{i} {{ font-size: {80*(5-i)}%; line-height: normal; margin-block-end: {0.1*(5-1)}em }}' for i in range(1, 5)])
  22. wp.head_html = '<script>confirm = () => true;</script>' # avoid confirmation dialog for reload
  23. main = jp.Div(a=wp, classes='q-ma-md column items-start', style='row-gap: 1em')
  24. main.add_page(wp)
  25. jp.justpy(lambda: wp, start_server=False)
  26. async def binding_loop():
  27. while True:
  28. binding.update()
  29. await asyncio.sleep(0.1)
  30. @jp.app.on_event('startup')
  31. def startup():
  32. [jp.run_task(t) for t in Timer.tasks]
  33. jp.run_task(binding_loop())
  34. Element.wp = wp
  35. Element.view_stack = [main]
  36. app = jp.app
  37. ui = Ui()