• Stars
    star
    467
  • Rank 93,935 (Top 2 %)
  • Language
    Python
  • License
    MIT License
  • Created about 2 years ago
  • Updated about 1 month ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

An experimental version of Streamlit Multi-Page Apps

Streamlit-Pages

Releases Build Status Python Versions Streamlit versions License Black

Streamlit App

Author: @blackary

Code: https://github.com/blackary/st_pages

Installation

pip install st-pages

See it in action

Basic example: https://st-pages.streamlit.app/

Example with sections: https://st-pages-sections.streamlit.app/

Why st-pages?

Summary: st-pages allows you to set the page names, order, and icons (and optionally group the pages into sections) in a multipage Streamlit app from your code without having to rename the files.

image

Streamlit has native support for multi-page apps where page filenames are the source of truth for page settings. But, it's a bit annoying to have to change the filename to change the names in the sidebar or reorder the pages in your app. Even more, I really dislike having to put emojis in filenames.

This is an experimental package to try out how page-management might work if you could name the pages whatever you wanted, and could manage which pages are visible, and how they appear in the sidebar, via a setup function.

This enables you to set page name, icon and order independently of file name/path, while still retaining the same sidebar & url behavior of current streamlit multi-page apps.

How to use

Method one: declare pages inside your streamlit code

from st_pages import Page, show_pages, add_page_title

# Optional -- adds the title and icon to the current page
add_page_title()

# Specify what pages should be shown in the sidebar, and what their titles and icons
# should be
show_pages(
    [
        Page("streamlit_app.py", "Home", "🏠"),
        Page("other_pages/page2.py", "Page 2", ":books:"),
    ]
)

If you want to organize your pages into sections with indention showing which pages belong to which section, you can do the following:

from st_pages import Page, Section, show_pages, add_page_title

add_page_title() # By default this also adds indentation

# Specify what pages should be shown in the sidebar, and what their titles and icons
# should be
show_pages(
    [
        Page("streamlit_app.py", "Home", "🏠"),
        Page("other_pages/page2.py", "Page 2", ":books:"),
        Section("My section", icon="🎈️"),
        # Pages after a section will be indented
        Page("Another page", icon="πŸ’ͺ"),
        # Unless you explicitly say in_section=False
        Page("Not in a section", in_section=False)
    ]
)

Method two: declare pages inside of a config file

Contents of .streamlit/pages.toml

[[pages]]
path = "streamlit_app.py"
name = "Home"
icon = "🏠"

[[pages]]
path = "other_pages/page2.py"
name = "Page 2"
icon = ":books:"

Example with sections:

[[pages]]
path = "streamlit_app.py"
name = "Home"
icon = "🏠"

[[pages]]
path = "other_pages/page2.py"
name = "Page 2"
icon = ":books:"

[[pages]]
name = "My second"
icon = "🎈️"
is_section = true

# Pages after an `is_section = true` will be indented
[[pages]]
name = "Another page"
icon = "πŸ’ͺ"

# Unless you explicitly say in_section = false`
[[pages]]
name = "Not in a section"
in_section = false

Streamlit code:

from st_pages import show_pages_from_config, add_page_title

# Either this or add_indentation() MUST be called on each page in your
# app to add indendation in the sidebar
add_page_title()

show_pages_from_config()

Hiding pages

You can now pass a list of page names to hide_pages to hide pages dynamically for each user. Note that these pages are only hidden via CSS, and can still be visited by the URL. However, this could be a good option if you simply want a way to visually direct your user where they should be able to go next.