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

如何在Streamlit按钮点击事件中嵌套file_uploader组件?

Streamlit 按钮触发文件上传组件后上传消失的解决方法

问题原因

Streamlit基于会话刷新机制运行:每次用户交互(点击按钮、上传文件等)都会触发整个脚本重新执行。你之前的代码里,点击"Submit"按钮后,脚本重新运行时按钮的点击状态不会被保留,导致if st.button("Submit")的条件不再成立,file_uploader组件就会被移除,所以上传完成后组件直接消失。

解决方法

用st.session_state存储按钮的点击状态,让页面刷新后状态依然保留,确保file_uploader能持续显示。

修改后的代码

import streamlit as st
import pandas as pd
import numpy as np
import os
import shutil

# 初始化会话状态,标记是否显示上传组件
if "show_uploader" not in st.session_state:
    st.session_state.show_uploader = False

opt_select = st.selectbox(
    "请选择一个选项",
    ("Abs", "Bgf")
)

if opt_select == "Abs":
    # 点击按钮切换上传组件的显示状态
    if st.button("提交"):
        st.session_state.show_uploader = not st.session_state.show_uploader
        if st.session_state.show_uploader:
            st.write("已创建新上传入口。")
    
    # 根据会话状态决定是否渲染上传组件
    if st.session_state.show_uploader:
        uploaded_file = st.file_uploader("上传文本文件", type=["txt"])
        if uploaded_file is not None:
            st.write("上传成功。")
        else:
            st.warning("未选择文件")

关键说明

  • st.session_state是Streamlit用来跨会话保存状态的工具,页面刷新后里面的值不会丢失。
  • 点击"提交"按钮时,我们切换show_uploader的布尔值,这样就能控制上传组件的显示/隐藏。
  • 把file_uploader放在独立的条件判断里,只要show_uploader为True,组件就会一直显示,直到再次点击按钮切换状态。

内容的提问来源于stack exchange,提问作者dartigan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:02:12