如何在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
相关产品推荐
相关产品推荐

