如何从Streamlit multiselect组件删除选中项并解决默认值报错问题
报错根因
- Streamlit页面重渲染逻辑优先级高于表单回调函数:点击提交按钮后,页面会先重新渲染所有组件,此时
st.session_state.selected还存储着之前选中的待删除选项,而st.session_state.options已经更新为删除后的列表,导致multiselect的默认值不在可选选项范围内,触发异常。 - 你在submit回调中清空
st.session_state.selected的操作执行时机晚于组件渲染,因此无法生效。
修复方案
你可以在渲染multiselect组件前,先过滤掉选中值里不存在于当前可选列表的无效值,作为组件的默认参数,同时修正原代码的导入拼写错误,修复后代码如下:
import streamlit as st if st.button("Refill") or "options" not in st.session_state: st.session_state.options = ["a", "b", "c"] def submit(): for item in st.session_state.selected: if item in st.session_state.options: st.session_state.options.remove(item) st.session_state.selected = [] form = st.form("My form") # 提前过滤有效选中值作为默认参数 valid_selected = [item for item in st.session_state.get("selected", []) if item in st.session_state.options] form.multiselect("Select", st.session_state.options, default=valid_selected, key="selected") form.form_submit_button("Submit", on_click=submit)
核心改动点:
- 修正导入错误:将错误的
streamline改为正确的streamlit - 渲染multiselect前先筛选出当前选中值中仍存在于可选列表的有效值,传入组件的
default参数,避免默认值不存在的问题 - 删除选项时增加存在性校验,避免重复删除抛出异常
内容的提问来源于stack exchange,提问作者arcGuesser
相关产品推荐
相关产品推荐

