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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:15:46