猿问

动态更改 Streamlit.multiselectbox 选项

我的 Streamlit 应用程序的侧边栏中有一个多选框。不失一般性:

  • 我有 10 个选项可以放入这个多选框中(这些是数字 1...10)

  • 用户不能同时选择1两者2

因此,我想2从可能的选择列表中删除 if 1,但 Streamlit 似乎没有此功能,因此我尝试将其包装在循环中,这也失败了(DuplicateWidgetID: There are multiple identical st.multiselect widgets with the same generated key.):

options = [1,2,3,4,5,6,7,8,9,10]


space = st.sidebar.empty()

answer, _answer = [], None

while True:

    if answer != _answer:

        answer.append(space.multiselectbox("Pick a number",

                                           options,

                                           default=answer

                                           )

                      )

        options = [o for o in options if o not in answer]

        if 1 in options:

            if 2 in options: options.remove(2)

        if 2 in options:

            if 1 in options: options.remove(1)

        _answer = answer[:]

关于我如何实现这一目标有什么想法吗?


Smart猫小萌
浏览 219回答 1
1回答

慕的地6264312

方法一这是一种方法,在小部件上提供帮助,只允许用户选择 1 和 2,但如果两者都被选择,我们必须过滤掉 2。然后您就可以使用经过验证的选择。代码import streamlit as stms = st.sidebar.multiselect('Pick a number',  list(range(1, 11)),    help='Choose either 1 or 2 but not both. If both are selected 1 will be used.')if 1 in ms and 2 in ms:    ms.remove(2)st.write('##### Valid Selection')st.write(str(ms))输出将鼠标悬停在 上?可显示帮助。方法二使用单选按钮选择选项 1 或 2,其余选项用于多选。代码import streamlit as strb = st.sidebar.radio('Pick a number', [1, 2])ms = st.sidebar.multiselect('Pick a number',  list(range(3, 11)))selected = msselected.append(rb)st.write('##### Valid Selection')st.write(str(selected))输出方法三选择 1 后,删除 2,然后重新运行以更新选项。同样,当选择 2 时,删除 1 并重新运行以更新选项。代码import streamlit as stinit_options = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]if 'options' not in st.session_state:    st.session_state.options = init_optionsif 'default' not in st.session_state:    st.session_state.default = []ms = st.sidebar.multiselect(    label='Pick a number',    options=st.session_state.options,    default=st.session_state.default)# If 1 is selected, remove the 2 and rerun.if 1 in ms:    if 2 in st.session_state.options:        st.session_state.options.remove(2)        st.session_state.default = ms        st.experimental_rerun()# Else if 2 is selected, remove the 1 and rerun.elif 2 in ms:    if 1 in st.session_state.options:        st.session_state.options.remove(1)        st.session_state.default = ms        st.experimental_rerun()st.write('##### Valid Selection')st.write(str(ms))输出
随时随地看视频慕课网APP

相关分类

Python
我要回答