为了账号安全,请及时绑定邮箱和手机立即绑定

动态更改 Streamlit.multiselectbox 选项

动态更改 Streamlit.multiselectbox 选项

Smart猫小萌 2023-12-09 15:34:59
我的 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 = [], Nonewhile 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[:]关于我如何实现这一目标有什么想法吗?
查看完整描述

1 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

方法一

这是一种方法,在小部件上提供帮助,只允许用户选择 1 和 2,但如果两者都被选择,我们必须过滤掉 2。然后您就可以使用经过验证的选择。


代码

import streamlit as st


ms = 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))

输出

将鼠标悬停在 上?可显示帮助。

https://img1.sycdn.imooc.com/657418c200017a9d04940188.jpg

方法二

使用单选按钮选择选项 1 或 2,其余选项用于多选。


代码

import streamlit as st


rb = st.sidebar.radio('Pick a number', [1, 2])


ms = st.sidebar.multiselect('Pick a number',  list(range(3, 11)))


selected = ms

selected.append(rb)


st.write('##### Valid Selection')

st.write(str(selected))

输出

https://img1.sycdn.imooc.com/657418cd00011a8d04890283.jpg

方法三

选择 1 后,删除 2,然后重新运行以更新选项。同样,当选择 2 时,删除 1 并重新运行以更新选项。


代码

import streamlit as st



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



if 'options' not in st.session_state:

    st.session_state.options = init_options

if '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))

输出

https://img1.sycdn.imooc.com/657418da000146af05140493.jpg

查看完整回答
反对 回复 2023-12-09
  • 1 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信