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

Removing the selected items from streamlet's multiselect

我正在尝试通过 streamlits 多选小部件选择对象来从列表中删除对象,并将列表条目作为小部件的条目。因此,该列表还决定了多选框中的选项。 然而,在应用程序重新运行后——一旦我删除了一些选项——我得到了错误:streamlit.errors.StreamlitAPIException: Every Multiselect default value must exist in options

这是一些最小的代码示例。

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

说明: streamlit multi-select 小部件将最后一个 selection 保持在其内部状态(在您的情况下为 st.session_state.selected),因此如果您从 st.session_state.options 列表中删除一个项目,它会出错,因为它无法在您传递给它的列表中找到当前的 selection。

要解决此问题,只需删除 运行 其余代码之前的 session_state.selected;这是通过建议的 if 语句完成的。

您可能还想在 st.form 定义中添加 kwarg clear_on_submit=True,因为这也会清除表单的输入。