Streamlit下载按钮点击后应用重载、输出丢失问题求助
问题解决:Streamlit下载按钮点击后应用重载导致输出消失
问题原因
Streamlit中所有交互组件(包括download_button)点击后都会触发应用全量重跑。你的代码中,处理后的_df1和_df2仅在点击Process按钮的代码块内生成,重跑后该代码块不再执行,因此表格和下载按钮会消失。
解决方案
使用Streamlit的Session State保存处理后的DataFrame,确保重跑时仍能读取到数据。修改后的完整代码如下:
import streamlit as st import pandas as pd import requests import json from datetime import datetime, timedelta,date import time # Mock function api_1 @st.cache_data def api_1(text): # 模拟返回数据(补充原代码缺失的answers定义) answers = ["result1_" + t for t in text] df = pd.DataFrame({"text": text, "output1": answers}) return df # Mock function api_2 @st.cache_data def api_2(text): # 模拟返回数据(补充原代码缺失的answers定义) answers = ["result2_" + t for t in text] df = pd.DataFrame({"text": text, "output2": answers}) return df # Streamlit UI layout st.set_page_config(page_title="DEMO UI", layout="wide") st.title("DEMO UI") # 初始化Session State,保存处理后的DataFrame if "_df1" not in st.session_state: st.session_state._df1 = None if "_df2" not in st.session_state: st.session_state._df2 = None # Side bar filters st.sidebar.header("Filters") text_input = st.sidebar.text_area("Enter text(s) (separated by line breaks)") uploaded_file = st.sidebar.file_uploader("Upload CSV file with text", type=["csv"]) _name = st.sidebar.selectbox("Select Client Name", ["A", "B", "C"]) _experience = st.sidebar.selectbox("Select Experience", ["W", "A"]) _type = st.sidebar.selectbox("Select Type", ["p", "b"]) default_columns = ['.....','...'] cols=['.....','...','.....','...'] with st.sidebar: all_columns = st.multiselect("ChooseColumns", cols, default=default_columns) # Button to trigger processing if st.sidebar.button("Process"): try: if uploaded_file is not None: texts = uploaded_file.read().decode("utf-8-sig").split("\n") else: texts = text_input.split("\n") text = [text.strip() for text in texts if text.strip()] # 移除字符串首尾的双引号 text=[u.replace('"', '') if (u.startswith('"') and u.endswith('"')) else u for u in text ] # 调用API并将结果存入Session State st.session_state._df1 = api_1(text) st.session_state._df2 = api_2(text) except Exception as e: st.error("An error occurred: {}".format(e)) # 独立渲染表格和下载按钮,依赖Session State中的数据 if st.session_state._df1 is not None: st.header("Response Tables") st.subheader("api_1") st.table(st.session_state._df1) st.download_button( label="Download 1", data=st.session_state._df1.to_csv(index=False, encoding="utf-8-sig"), file_name="file1.csv", key="key1" ) if st.session_state._df2 is not None: st.subheader("api_2") st.table(st.session_state._df2) st.download_button( label="Download 2", data=st.session_state._df2.to_csv(index=False, encoding="utf-8-sig"), file_name="file2.csv", key="key2" )
关键修改点
- 初始化Session State:在应用启动时创建
_df1和_df2的会话状态变量,默认值为None。 - 保存处理结果:点击Process按钮后,将API返回的DataFrame存入
st.session_state,而非仅存于局部变量。 - 分离渲染逻辑:将表格和下载按钮的渲染代码从Process按钮的代码块中移出,改为判断Session State中的数据是否存在,确保重跑时仍能显示内容。
修改后,点击下载按钮触发重跑时,Session State中仍保留处理后的DataFrame,表格和下载按钮不会消失,可正常点击另一个下载按钮。
内容的提问来源于stack exchange,提问作者MAC
相关产品推荐
相关产品推荐

