Time.sleep(1) Not Working as Expected in on_change Callback

I am trying to disable st.number_input for 1-2 seconds using time.sleep(1) and then enable it again. However, when I use on_change, time.sleep() does not seem to work—the input is not disabled for 1 second. Instead, it is immediately enabled again.

My question: Why does time.sleep(1) not delay the UI update for 1 second?

Can anyone help me explain why time.sleep() does not work as expected in Streamlit with on_change?

Here is my code:


import streamlit as st
import time

if "num" not in st.session_state:
    st.session_state.num = 0

if "disable_input" not in st.session_state:
    st.session_state.disable_input = False

@st.fragment
def number_input_fragment():
    def on_click():
        st.session_state.disable_input = True
        time.sleep(1)  # Delay for 1 second
        st.session_state.disable_input = False

    num = st.number_input(
        "Select a number",
        step=1,
        key="num",
        disabled=st.session_state.disable_input,
        on_change=on_click  # Triggers when value changes
    )
    st.write(num)

st.write("### Number Input Fragment Demo")

number_input_fragment()

By the time st.number_input is called, st.session_state.disable_input is always False.

1 Like