在 Streamlit 的复选框中选择多个选项

Posted

技术标签:

【中文标题】在 Streamlit 的复选框中选择多个选项【英文标题】:Select multiple options in checkboxes in Streamlit 【发布时间】:2021-06-17 10:56:11 【问题描述】:

我是 Streamlit 的新手。我想进行多项选择用户输入(复选框)。但我想从 4 个选项中选择最多 3 个选项。

我试过multiselect的下拉功能。

import streamlit as st
option = st.multiselect('Select three known variables:', ['initial velocity (u)', 'final velocity (v)', 'acceleration (a)', 'time (t)'])  

它有效。但我认为这对我的情况来说不是用户友好的。此外,在这里我无法将选择限制为 4 个中的 3 个。用户可以在这里选择所有 4 个选项。但是我想要这样的代码,如果选择了第 4 个,那么之前的选择(第 3 个选项)将自动取消选择。我更喜欢复选框的外观,例如 radio 按钮:

import streamlit as st
option = st.radio('Select three known variables:', ['initial velocity (u)', 'final velocity (v)', 'acceleration (a)', 'time (t)'])  

但是使用radio,我无法选择多个选项。如何编辑它以便我可以将其显示为复选框并且只能选择 3 个选项?

【问题讨论】:

似乎限制复选框选项还不可能......在他们的 Github 存储库中有一个开放的功能请求 - link 【参考方案1】:

这在视觉上最接近您想要的,因为它们实际上是复选框,而不是单选按钮。但是你不能限制选择的选项,所以它们都可以被选中。

st.write('Select three known variables:')
option_1 = st.checkbox('initial velocity (u)')
option_2 = st.checkbox('final velocity (v)')
option_3 = st.checkbox('acceleration (a)')
option_4 = st.checkbox('time (t)')

作为一种解决方法,您可以通过以下方式使用单选按钮,因为它们只允许检查一个组合:

option = st.radio('Select three known variables:',
                  ['initial velocity (u), final velocity (v), acceleration (a)',
                   'initial velocity (u), final velocity (v), time (t)',
                   'initial velocity (u), acceleration (a), time (t)',
                   'final velocity (v),acceleration (a), time (t)'])

【讨论】:

感谢您的回答。我也在考虑使用radio 进行这种分组技术。但在我的主程序中,总选项数为 5。我想从中选择任意 3 个。所以,我需要提供总共 10 种不适合我的目的的组合。 checkbox 无法限制选择。但是是否可以应用条件语句,如果用户选择了第 4 个,那么之前的选择(第 3 个选项)将自动取消选择?【参考方案2】:

我还没有找到任何streamlit 函数可以正确满足我的需求。因此,我按照anilewe 的建议使用函数streamlit.checkbox,并添加一些额外的条件语句,以便用户必须选择任意3 个复选框。 这是我的代码:

import streamlit as st
st.write('Select three known variables:')
option_s = st.checkbox('displacement (s)')
option_u = st.checkbox('initial velocity (u)')
option_v = st.checkbox('final velocity (v)')
option_a = st.checkbox('acceleration (a)')
option_t = st.checkbox('time (t)')
known_variables = option_s + option_u + option_v + option_a + option_t

if known_variables <3:
    st.write('You have to select minimum 3 variables.')
elif known_variables == 3:
   st.write('Now put the values of your selected variables in SI units.')
else:
    st.write('You can select maximum 3 variables.')

更新:Creating a dictionary 可以更加自动化和有用;在将方法从 st.checkbox 更改为其他方法的情况下也很有帮助:

import streamlit as st
st.write('Select three known variables:')
opts = [ ('s', 'displacement'), ('u', 'initial velocity'), ('v', 'final velocity'), ('a', 'acceleration'), ('t', 'time') ]
known_variables = symbol: st.checkbox(f"name (symbol)") for symbol, name in opts    

if sum(known_variables.values()) < 3:
    st.write('You have to select minimum 3 variables.')
elif sum(known_variables.values()) == 3:
    st.write('Now put the values of your selected variables in SI units.')
else:
    st.write('You can select maximum 3 variables.')

不过,我希望获得一个看起来像 checkboxradio 按钮的功能,但具有限制特定选择数量的内置功能。总之,我认为我想要的功能可以称为“多选收音机”。因此,我不会对自己限制选择设置附加条件。

【讨论】:

以上是关于在 Streamlit 的复选框中选择多个选项的主要内容,如果未能解决你的问题,请参考以下文章

多个复选框选项存储到数据库的单个字段中

当一个选项(复选框)打开时,是否可以单击多个复选框,而当它关闭时,您一次只能选择一个?

无法选中好选择多个下拉列表的复选框?

SumoSelect 不显示复选框或允许(多个或单个)选择

使用复选框插入信息

Swift - 多个 TableView 复选标记 - 保存和加载选择