【问题标题】:Save variables for different radio button selections为不同的单选按钮选择保存变量
【发布时间】:2022-01-13 14:16:40
【问题描述】:

我想用我的 Streamlit 应用程序选择两个数字:a 和 b。 我想以两种不同的方式执行此操作,使用单选按钮选择它们。

首先,我希望能够选择预定义的数字组(“组”)。 一旦我选择了一个数字组,我希望之后能够单独调整“a”和“b”。

我的问题是: 一旦我完成“组”并单击“单独选择”,我的选择就会丢失,我会回到默认状态。 我的错误在哪里?

示例代码:

import streamlit as st

try:
    num
except:
    num = 0

try:
    a
except:
    a = 0

try:
    b
except:
    b = 500

range_a = range(0, 1000)
fix_a = [10, 50, 665]
range_b = range(500, 3333)
fix_b = [560, 2216, 2855]
group = [f"{num_temp}:{a_temp}:{b_temp}" for num_temp, (a_temp, b_temp) in enumerate(zip(fix_a, fix_b))]


rb = st.radio(label="How to select", options=['Group', 'Select individually'])
if rb == "Group":
    num_name = st.selectbox("", options=group, index=num)
    num, a, b = num_name.split(":", 2)
if rb == "Select individually":
    a = st.number_input("a", value=a, min_value=range_a[0], max_value=range_a[-1])
    b = st.number_input("b", value=b, min_value=range_b[0], max_value=range_b[-1])

st.write(f"{num}: A:{a}, B:{b}")

编辑 1:

import streamlit as st

if "num" not in st.session_state:
    st.session_state['num'] = 0

if "a" not in st.session_state:
    st.session_state['a'] = 0

if "b" not in st.session_state:
    st.session_state['b'] = 500

range_a = range(0, 1000)
fix_a = [10, 50, 665]
range_b = range(500, 3333)
fix_b = [560, 2216, 2855]
group = [f"{num_temp}:{a_temp}:{b_temp}" for num_temp, (a_temp, b_temp) in enumerate(zip(fix_a, fix_b))]


rb = st.radio(label="How to select", options=['Group', 'Select individually'])
if rb == "Group":
    num_name = st.selectbox("", options=group, index=int(st.session_state['num']))
    st.session_state['num'], st.session_state['a'], st.session_state['b'] = num_name.split(":", 2)
if rb == "Select individually":
    st.session_state['a'] = st.number_input("a", value=int(st.session_state['a']), min_value=range_a[0], max_value=range_a[-1])
    st.session_state['b'] = st.number_input("b", value=int(st.session_state['b']), min_value=range_b[0], max_value=range_b[-1])

st.write(f"{st.session_state['num']}: A:{st.session_state['a']}, B:{st.session_state['b']}")

【问题讨论】:

    标签: python streamlit


    【解决方案1】:

    这种行为是正常的,因为 streamlit 会从上到下重新运行整个脚本。

    查看session state 功能来解决您的问题。

    【讨论】:

    • 感谢您的回答。但是我仍然有两个问题:1)我知道streamlit一次又一次地从上到下重新运行。这就是我使用 try-except 块的原因。为什么他们不工作?他们只能为 var 赋值一次;当没有var时。 2) 不幸的是,我对 number_input 处的新解决方案有疑问。我必须将时钟加倍才能将数字增加一。我的解决方案可能有问题。
    • 1.它不会分配一次,因为它会从上到下运行。
    • 在第二季度我可以重现这个问题,看起来像一个错误。您可以在 github 提出问题或在 st 社区中先提问。
    猜你喜欢
    • 2012-12-30
    • 1970-01-01
    • 2017-07-24
    • 2017-05-23
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    相关资源
    最近更新 更多