如何在Streamlit中点击按钮切换页面?switch_page函数使用存疑
Streamlit 使用 switch_page 实现页面跳转的正确方式
你的核心问题是没搞懂switch_page的运行逻辑,以及当前代码的执行流程存在错误,下面是具体的修正方案:
1. 明确 switch_page 的核心行为
调用switch_page("页面名称")后,Streamlit会立即触发页面跳转,当前脚本中这行代码之后的所有逻辑都不会被执行。你现在在switch_page后写的fileDetails = file_upload()完全是无效代码,永远不会运行。
2. 正确的实现步骤与代码修正
第一步:调整项目结构(适配多页面跳转)
在项目根目录创建pages文件夹,把文件上传相关的代码作为独立页面放在这个文件夹下(比如命名为file_upload.py)。这样switch_page才能正确找到目标页面。
第二步:主脚本(比如app.py)的逻辑
import streamlit as st from login import check_password from welcome import welcome_page from streamlit_extras.switch_page_button import switch_page if check_password(): # 显示欢迎页面,若点击跳转按钮则触发页面切换 if welcome_page(): switch_page("file_upload")
第三步:welcome.py中的跳转按钮逻辑
确保welcome_page函数返回按钮的点击状态:
import streamlit as st def welcome_page(): st.title("欢迎页") # 点击该按钮后返回True,触发主脚本中的跳转 return st.button("去上传文件")
第四步:pages/file_upload.py的完整逻辑
把文件上传的逻辑独立成页面:
import streamlit as st from PIL import Image import numpy as np def main(): st.title("文件上传页面") datafile = st.file_uploader("Upload JPG", type=['jpg']) if datafile is not None: # 注意:需要先用PIL打开上传的文件,再转numpy数组 img = Image.open(datafile) numpydata = np.asarray(img) print(type(numpydata)) st.image(datafile) st.success("文件上传成功") if __name__ == "__main__": main()
关键注意点
- 页面名称匹配:
switch_page的参数是目标页面的文件名(去掉.py后缀),比如pages/file_upload.py对应的页面名称是file_upload - 原代码的数组转换错误:直接把
st.file_uploader返回的UploadedFile对象转numpy数组会报错,必须先用PIL打开图片再转换 - 跳转后逻辑终止:一旦调用
switch_page,当前脚本后续代码不会执行,所以不需要在主脚本中再调用目标页面的函数
内容的提问来源于stack exchange,提问作者Saad Saleem
相关产品推荐
相关产品推荐

