Is there a way to disable sidebar for multipage navigation until main page has finished loading?

Summary

I’m having the main page perform some predictions. But every time I go to a different page while it is not complete and return back, I get an error and have to refresh the entire page. Is there a way to just disable page navigation until the loading process is completed?

Here is a sample demo on how this can be done. There can be other ways. In this demo there is a selectbox in the sidebar that we want to disable if we run a prediction.

A selectbox has a disabled parameter, we can use it to enable/disable this box. Create a callback function in the prediction button to disable the selectbox in the sidebar. We also need a variable to handle selectbox disability.

import time

import streamlit as st


if 'selboxdisabled' not in st.session_state:
    st.session_state.selboxdisabled = False


def cb():
    """Disables sidebar selectbox.

    A callback function to be executed when prediction
    button is pressed or triggered.    
    """
    st.session_state.selboxdisabled = True


def run_prediction(sec):
    time.sleep(sec)
    return 'done'


st.sidebar.selectbox('select name',
                     ['', 'roel', 'alex', 'allan'],
                     disabled=st.session_state.selboxdisabled)


run = st.button('do prediction', on_click=cb)

if run:
    status = run_prediction(5)

    # Restore selboxdisabled state.
    if status == 'done':
        st.success('prediction is done')
        st.session_state.selboxdisabled = False

        # Call rerun so that streamlit will rerun the code
        # from top to bottom thereby hitting the statement:
        # st.sidebar.selectbox(...)
        # but now with st.session_state.selboxdisabled set to False.
        # As a result the sidebar selectbox will be enabled again.
        st.experimental_rerun()

This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.