Streamlit嵌套按钮使用Session State报错求助
问题解决方法
报错原因
你遇到的StreamlitAPIException是因为按钮的key与session_state中的变量名重名,且Streamlit禁止通过st.session_state直接设置st.button这类组件的状态值。原代码中st.button('RECOMMEND', key='rec_btn')的key和st.session_state.rec_btn同名,触发了这个限制。
修正后的代码
import re # 假设tf_idf_vectorizer和model_sentiment已提前定义 # 假设output_images、output_names是已准备好的推荐数据 # 初始化session_state,使用与按钮key不同的变量名 if 'show_recommendations' not in st.session_state: st.session_state.show_recommendations = False if 'review_submitted' not in st.session_state: st.session_state.review_submitted = False # 点击RECOMMEND按钮后,标记需显示推荐内容 if st.button('RECOMMEND', key='recommend_btn'): st.session_state.show_recommendations = True st.session_state.review_submitted = False # 重置提交状态 # 根据状态判断是否显示推荐内容 if st.session_state.show_recommendations: col1, col2, col3 = st.columns(3) with col1: st.image(output_images[0]) st.markdown(output_names[0].upper()) # 未提交影评时显示输入框和提交按钮 if not st.session_state.review_submitted: review = st.text_input(f"How much you liked the movie {output_names[0]}") if st.button('submit', key='submit_btn'): # 清洗影评文本 cleaned_review = re.sub('[^a-zA-Z0-9 ]','', review) # 情感分析处理 review_vector = tf_idf_vectorizer.transform([cleaned_review]) ans = model_sentiment.predict(review_vector) # 生成反馈文本 feedback = 'Thanks for your positive review' if ans == 0 else 'Sorry for your negative review' st.write(feedback) # 标记影评已提交,避免重复处理 st.session_state.review_submitted = True
关键修改点
- 分离命名避免冲突:将控制推荐显示的状态变量命名为
show_recommendations,按钮key改为recommend_btn,彻底规避命名冲突问题。 - 状态持久化:通过session_state记录推荐内容的显示状态,确保页面刷新后推荐内容不会消失。
- 提交状态控制:新增
review_submitted变量,防止用户重复提交影评,提交后自动锁定提交逻辑。 - 逻辑拆分:让RECOMMEND按钮仅负责切换显示状态,submit按钮专注处理影评提交,代码逻辑更清晰。
内容的提问来源于stack exchange,提问作者Tushar Nautiyal
相关产品推荐
相关产品推荐

