问题描述
我试图通过 streamlits 多选小部件选择对象来从列表中删除对象,将列表条目作为小部件的条目。因此,列表还决定了多选框中的选项。 但是,在应用重新运行后——一旦我删除了一些选项——我得到了错误:streamlit.errors.StreamlitAPIException: 每个多选默认值都必须存在于选项中
这是一些最小的代码示例。
import streamline 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:
st.session_state.options.remove(item)
form=st.form("My form")
form.multiselect("Select",st.session_state.options,key="selected")
form.form_submit_button("Submit",on_click=submit)
我尝试添加该行
st.session_state.selected=[]
提交功能,以便清除多选框并且不引用已删除的项目,但没有解决问题。
提前感谢您的帮助! :)
解决方法
在代码顶部添加以下内容:
if "selected" in st.session_state:
del st.session_state.selected
说明:
流线型多选小部件将最后一个选择保持在其内部状态(在您的情况下为 st.session_state.selected),因此如果您从 st.session_state.options
列表中删除一个项目,它会出错,因为它不能在传递给它的列表中找到当前选择。
要解决此问题,只需在运行其余代码之前删除 session_state.selected
;这是通过建议的 if 语句完成的。
您可能还想在 st.form 定义中添加 kwarg clear_on_submit=True
,因为这也会清除表单的输入。