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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:52:22