Streamlit中如何隐藏部分页面,仅指定页面显示并动态控制?
实现Streamlit动态页面显示方案
Streamlit没有直接支持从配置文件动态切换页面显示的内置函数,但可以通过手动构建页面列表结合会话状态(session_state)控制来实现需求,替代直接调用show_pages_from_config。
核心思路
- 提前定义所有页面的元数据(或从pages.toml读取)
- 用
st.session_state标记页面是否解锁(首次启动默认未解锁) - 根据解锁状态筛选要显示的页面,调用
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
相关产品推荐
相关产品推荐

