从 streamlet 的多选中删除所选项目

问题描述

我试图通过 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,因为这也会清除表单的输入。