Streamlit点击Add按钮仅新增一次Selectbox,如何实现多次新增?
问题根源
你没通过Session State持久化需要创建的selectbox数量,Streamlit每次交互都会重新运行整个脚本,原来的回调直接创建组件的方式,刷新后之前的组件会丢失,且按钮点击状态无法保留,所以只能新增一次。
解决代码及说明
1. 初始化Session State
在脚本开头添加这段代码,用来持久化selectbox的数量:
# 初始化session state,记录当前selectbox的数量 if "num_selectboxes" not in st.session_state: st.session_state.num_selectboxes = 0
2. 修改回调函数
回调只负责更新计数,不再直接创建组件,同时限制最多创建10个:
def add_callback(): if st.session_state.num_selectboxes < 10: st.session_state.num_selectboxes += 1
3. 重构按钮与组件渲染逻辑
按钮简化参数,然后根据Session State里的计数循环生成selectbox,每个组件必须加唯一key避免冲突:
# 定义存放selectbox的容器 tests_body_container = st.container() # Add按钮 st.button("Add", on_click=add_callback, help="Add a new test", key="Add") # 根据计数渲染对应数量的selectbox with tests_body_container: for idx in range(st.session_state.num_selectboxes): st.selectbox(f"options? {idx+1}", ("a", "b", "c"), key=f"selectbox_{idx}")
核心逻辑说明
- Session State会在Streamlit会话中持久化数据,不会因页面刷新丢失计数
- 给每个selectbox加唯一
key,是让Streamlit能区分不同组件,避免状态混乱 - 把组件渲染和回调分离,回调只更新计数,渲染交给循环处理,完全符合Streamlit的运行机制
内容的提问来源于stack exchange,提问作者evening
相关产品推荐
相关产品推荐

