St.status spinner keeps showing unnecessarily even though my function is cached

This is my code:


@st.cache_data(show_spinner=False)
def fetch_data():
    with st.status("Buscando datos...", expanded=True) as status:
        time.sleep(2)
        st.write("Partidos encontrados...")
        time.sleep(2)
        st.write("Descargando datos...")
        time.sleep(2)
        st.write("Dibujando tabla...")
        game_data = scraper.get_data(game_list_input=games_id)
        data_df = scraper.get_data_df(data_list=game_data)
        games_data = data_df.to_pandas()
        time.sleep(3)
        status.update(
            label="¡Descarga completada!", state="complete", expanded=False
        )
        return games_data
games_data = fetch_data()

Cache is working fine, fetch_data() function is not executing everytime I reload the page, but spinner keeps showing. I am using show_spinner=False but it doesn’t work either as you can see in the next picture:

Table is showing but as you can see spinner still there.

If you need to know, I am using a API Scrapper for the MLB API. get_data and get_data_df are methods of a class from API Scrapper that return a polars dataframe.

Hey Hi @Ivan2 can you provide me your full code or else github link.

I can reproduce the issue with this simpler code, using streamlit 1.40:

import streamlit as st


@st.cache_resource
def fetch_data():
    with st.status("Status label"):
        st.write("Status message")
    return "The data"


data = fetch_data()
st.write(data)

On rerunning or starting a new session a spurious spinner appears that seems to last forever. Looks like a bug to me. But to be honest I don’t totally understand what the expected behavior of calling widget functions in cached functions is.

1 Like

@Goyo

I found the problem. This is because show_spinner=Falsedoesn’t work with st.status(), only with st.spinner(). So I changed my code to this:

@st.cache_data(show_spinner=False)
def fetch_data():
    with st.spinner("Descargando datos...") as status:
        game_data = scraper.get_data(game_list_input=games_id)
        data_df = scraper.get_data_df(data_list=game_data)
        games_data = data_df.to_pandas()
        time.sleep(3)
        st.success("¡Descarga completada!", icon="✅")
        return games_data

games_data = fetch_data()

Of course, if you get rid of the status then “st.status spinner keeps showing unnecesarily” becomes a non-issue.

1 Like

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