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

Streamlit中如何隐藏部分页面,仅指定页面显示并动态控制?

实现Streamlit动态页面显示方案

Streamlit没有直接支持从配置文件动态切换页面显示的内置函数,但可以通过手动构建页面列表结合会话状态(session_state)控制来实现需求,替代直接调用show_pages_from_config。

核心思路

  1. 提前定义所有页面的元数据(或从pages.toml读取)
  2. 用st.session_state标记页面是否解锁(首次启动默认未解锁)
  3. 根据解锁状态筛选要显示的页面,调用st.show_pages()渲染

具体实现代码

方式1:手动定义页面列表(直接可控)

import streamlit as st

# 定义所有页面的配置(与你的pages.toml内容对应)
ALL_PAGES = [
    st.Page("src/features/home.py", name="Home", icon="🏠"),
    st.Page("src/features/page0.py", name="page0", icon="🔍"),
    st.Page("src/features/page1.py", name="page1", icon="📝"),
    st.Page("src/features/page2.py", name="page2", icon="📝"),
]

# 初始化会话状态
if "current_page" not in st.session_state:
    st.session_state.current_page = "Home"
    print("change the current page to ::", st.session_state.current_page )
# 新增状态标记:是否解锁全部页面
if "pages_unlocked" not in st.session_state:
    st.session_state.pages_unlocked = False

add_page_title()

# 根据状态筛选显示的页面
if st.session_state.pages_unlocked:
    st.show_pages(ALL_PAGES)
else:
    # 首次运行仅显示Home和page0
    initial_pages = [page for page in ALL_PAGES if page.name in ["Home", "page0"]]
    st.show_pages(initial_pages)

# 示例:添加解锁触发逻辑(可替换为你的业务场景,比如登录/表单提交后)
if not st.session_state.pages_unlocked:
    if st.button("解锁更多页面"):
        st.session_state.pages_unlocked = True
        st.rerun()

方式2:从pages.toml读取配置(避免重复定义)

如果想复用现有pages.toml配置,可通过读取配置文件解析后生成页面列表:

import streamlit as st
import tomllib

# 读取pages.toml配置文件
with open("config_files/.streamlit/pages.toml", "rb") as f:
    config = tomllib.load(f)
all_pages_config = config["pages"]

# 转换为st.Page对象列表
ALL_PAGES = [
    st.Page(page["path"], name=page["name"], icon=page["icon"])
    for page in all_pages_config
]

# 后续逻辑同方式1(初始化会话状态、筛选页面、解锁触发)
if "current_page" not in st.session_state:
    st.session_state.current_page = "Home"
    print("change the current page to ::", st.session_state.current_page )
if "pages_unlocked" not in st.session_state:
    st.session_state.pages_unlocked = False

add_page_title()

if st.session_state.pages_unlocked:
    st.show_pages(ALL_PAGES)
else:
    initial_pages = [page for page in ALL_PAGES if page.name in ["Home", "page0"]]
    st.show_pages(initial_pages)

if not st.session_state.pages_unlocked:
    if st.button("解锁更多页面"):
        st.session_state.pages_unlocked = True
        st.rerun()

关键说明

  • 替换st.show_pages_from_config为st.show_pages(),后者接受自定义页面列表,支持动态筛选
  • pages_unlocked状态可根据你的业务逻辑触发(比如用户完成认证、提交特定表单后自动设置为True)
  • 调用st.rerun()是为了在状态变更后立即刷新页面,更新侧边栏的页面列表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:13:14