Hello,
I have an app which take several seconds to build before showing anything.
I was wondering if it was possible to show a loading spinner while the app is initializing in an other thread
I succeed to make something similar when the app is embed in a standard Viewable (cf code below)
However I don’t know if it is possible to do it with a panel Template
import time
import threading
import panel as pn
from functools import partial
def my_app():
time.sleep(1)
return pn.pane.Markdown("App ready")
# return pn.template.BootstrapTemplate()
def _center_loading_spinner():
return pn.Column(pn.Spacer(sizing_mode="stretch_height"),
pn.Row(
pn.Spacer(sizing_mode="stretch_width"),
pn.widgets.LoadingSpinner(align="center", value=True),
pn.Spacer(sizing_mode="stretch_width"),
sizing_mode="stretch_both"
),
pn.Spacer(sizing_mode="stretch_height"),
sizing_mode="stretch_both",
)
def _on_app_ready(app, root):
root.objects = [app()]
def _app_launcher(app):
main = pn.Column(sizing_mode="stretch_both")
spinner = _center_loading_spinner()
main.objects = [spinner]
th = threading.Thread(target=partial(_on_app_ready, app=app, root=main))
th.start()
return main
if __name__ == "__main__":
# import debugpy
# debugpy.listen(5678)
# debugpy.wait_for_client()
def app_launcher():
return _app_launcher(my_app)
server = pn.io.get_server(app_launcher)
print(f"Bokeh app running at: http://localhost:{server.port}")
server.run_until_shutdown()