Streamlit应用点击下载按钮后图表消失的解决办法与表单重提方案
解决Streamlit下载按钮点击后图表消失的问题
问题原因
Streamlit中所有交互按钮(包括st.download_button)点击都会触发页面全量重渲染。原逻辑仅在表单提交按钮submitted为True时渲染图表和下载按钮,重渲染后submitted会重置为False,导致图表直接消失。
解决方案:用Session State保存状态与数据
核心思路是把筛选后的数据集和提交状态存入Streamlit的st.session_state,页面重渲染时直接读取已保存的状态和数据,无需重新提交表单就能恢复图表和下载按钮。
修改后的代码示例:
import streamlit as st import pandas as pd # 初始化Session State变量 if 'filtered_data' not in st.session_state: st.session_state.filtered_data = None if 'form_submitted' not in st.session_state: st.session_state.form_submitted = False with st.form(key="input_parameters"): choices = st.multiselect("选择筛选选项", ["选项A", "选项B", "选项C"]) # 其他输入组件(如日期范围选择器等)... submitted = st.form_submit_button("Submit") if submitted: # 调用数据获取逻辑 data = get_data(choices) # 将数据和提交状态存入Session State st.session_state.filtered_data = data st.session_state.form_submitted = True # 根据Session State的状态渲染图表和下载按钮 if st.session_state.form_submitted and st.session_state.filtered_data is not None: st.line_chart(st.session_state.filtered_data) # 转换数据为CSV格式 csv_content = st.session_state.filtered_data.to_csv(index=False).encode('utf-8') st.download_button( label="Download CSV", data=csv_content, file_name="filtered_data.csv", mime="text/csv" )
关于“用相同输入重新提交表单”的疑问
不推荐这种做法:每次重新提交都会重复执行get_data逻辑,如果数据获取涉及数据库查询、API调用或复杂计算,会额外消耗资源并增加用户等待时间。使用Session State复用已筛选好的数据,是更高效的解决方案。
内容的提问来源于stack exchange,提问作者Raphael Roth
相关产品推荐
相关产品推荐

