You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Streamlit中初始化复杂session_state存储输入值遇困难

Streamlit Session State 初始化错误修复

错误根源

你把st.session_state["user_inputs"]初始化为布尔值True,但后续代码试图把它当作字典来存储键值对(比如st.session_state.user_inputs[f'{question}_checkbox_1'])。布尔类型不支持这种键值赋值操作,这才是报错的核心,并非真的没完成初始化。

修正代码

将user_inputs初始化为空字典,就能正常存储各类输入值:

import streamlit as st

# 初始化user_inputs为空字典,替换原来的布尔值初始化
if "user_inputs" not in st.session_state:
    st.session_state["user_inputs"] = {}

# 循环生成8组问题
for i in range(8):
    question = f'Question {i+1}'
    st.subheader(question)
    
    # 创建复选框,建议添加key避免组件冲突
    checkbox1 = st.checkbox('Option 1', key=f'{question}_checkbox_1')
    checkbox2 = st.checkbox('Option 2', key=f'{question}_checkbox_2')
    checkbox3 = st.checkbox('Option 3', key=f'{question}_checkbox_3')
    
    # 将复选框值存入session_state的字典中
    st.session_state.user_inputs[f'{question}_checkbox_1'] = checkbox1
    st.session_state.user_inputs[f'{question}_checkbox_2'] = checkbox2
    st.session_state.user_inputs[f'{question}_checkbox_3'] = checkbox3
    
    # 数字输入框
    integer_input = st.number_input('Integer Input', key=f'{question}_integer_input')
    st.session_state.user_inputs[f'{question}_integer_input'] = integer_input

# 滑块组件
slider = st.slider('Slider', 0, 100, key='slider')
st.session_state.user_inputs['slider'] = slider

# 提交按钮
if st.button('Submit'):
    st.success('Form submitted!')
    # 可选:打印所有存储的输入值
    st.write(st.session_state.user_inputs)

额外优化

  • 给每个输入组件添加key参数:既避免Streamlit自动生成的key冲突,也能让组件值自动同步到st.session_state,甚至可以省去手动赋值步骤(比如st.checkbox(..., key='xxx')会直接把值存在st.session_state['xxx'])。
  • 用表单包裹组件:减少页面重渲染次数,提升交互体验:
import streamlit as st

if "user_inputs" not in st.session_state:
    st.session_state["user_inputs"] = {}

with st.form("user_input_form"):
    for i in range(8):
        question = f'Question {i+1}'
        st.subheader(question)
        
        checkbox1 = st.checkbox('Option 1', key=f'{question}_checkbox_1')
        checkbox2 = st.checkbox('Option 2', key=f'{question}_checkbox_2')
        checkbox3 = st.checkbox('Option 3', key=f'{question}_checkbox_3')
        
        integer_input = st.number_input('Integer Input', key=f'{question}_integer_input')
        
        # 提交时同步到字典
        st.session_state.user_inputs[f'{question}_checkbox_1'] = checkbox1
        st.session_state.user_inputs[f'{question}_checkbox_2'] = checkbox2
        st.session_state.user_inputs[f'{question}_checkbox_3'] = checkbox3
        st.session_state.user_inputs[f'{question}_integer_input'] = integer_input
    
    slider = st.slider('Slider', 0, 100, key='slider')
    st.session_state.user_inputs['slider'] = slider
    
    # 表单专属提交按钮
    submitted = st.form_submit_button("Submit")
    if submitted:
        st.success('Form submitted!')
        st.write(st.session_state.user_inputs)

内容的提问来源于stack exchange,提问作者javad sadeghi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:02:53