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
相关产品推荐
相关产品推荐

