I need to grab all input widgets on a page (except for 1) in order to disable them, how would this be done?
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,
)
Very clever! I used a similar idea yesterday to dynamically render a page based on sidebar control - calling RAG vs LLM diectly, Love streamlit.