You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 05:12:18