How to grab all "input" Widgets on a page

I need to grab all input widgets on a page (except for 1) in order to disable them, how would this be done?

2 Likes

I’m not sure exactly what you’re looking for, and there’s no automatic way to get “all the inputs”, but you can do something like this using session state keys:

import streamlit as st


def disable_all_but():
    num = st.session_state.get("disable-slider", 1)
    st.session_state.not_disabled = "widget-" + str(num)


if "not_disabled" not in st.session_state:
    st.session_state.not_disabled = None
    disable_all_but()


def is_disabled(key):
    return st.session_state.not_disabled != key


st.button("Key=widget-1", key="widget-1", disabled=is_disabled("widget-1"))

st.button("Key=widget-2", key="widget-2", disabled=is_disabled("widget-2"))

st.button("Key=widget-3", key="widget-3", disabled=is_disabled("widget-3"))

st.button("Key=widget-4", key="widget-4", disabled=is_disabled("widget-4"))

st.text_input("Key=widget-5", key="widget-5", disabled=is_disabled("widget-5"))

st.text_input("Key=widget-6", key="widget-6", disabled=is_disabled("widget-6"))

st.text_input("Key=widget-7", key="widget-7", disabled=is_disabled("widget-7"))

st.text_input("Key=widget-8", key="widget-8", disabled=is_disabled("widget-8"))

st.slider(
    "Disable",
    key="disable-slider",
    min_value=1,
    max_value=8,
    value=1,
    on_change=disable_all_but,
)
1 Like

Very clever! I used a similar idea yesterday to dynamically render a page based on sidebar control - calling RAG vs LLM diectly, Love streamlit.

1 Like