一个允许您创建多页streamlit应用的的小型包
项目描述
Streamlit Multipage
一个简单的Python包,用于使用streamlit实现多页应用。
pip install streamlit-multipage
入门指南
简单的单页应用
给定一个Python文件中的streamlit应用,如下所示
import streamlit as st
st.title("My Amazing App")
name = st.text_input("Your Name: ")
st.write(f"Hello {name}!")
将其包装在一个带有st
参数和任意关键字参数的函数中。
import streamlit as st
from streamlit_multipage import MultiPage
def my_page(st, **state):
st.title("My Amazing App")
name = st.text_input("Your Name: ")
st.write(f"Hello {name}!")
app = MultiPage()
app.st = st
app.add_app("Hello World", my_page)
app.run()
此示例非常简单,不会提供额外的价值。下一个示例将介绍状态持久化。
保存状态
如果状态应在重新运行(按R
)或应用程序运行(运行streamlit run
)之间持久化。可以通过调用save
函数来保存变量,并通过state
字典方便地访问它们。
import streamlit as st
from streamlit_multipage import MultiPage
def my_page(st, **state):
st.title("My Amazing App")
name_ = state["name"] if "name" in state else ""
name = st.text_input("Your Name: ", value=name_)
st.write(f"Hello {name}!")
MultiPage.save({"name": name})
app = MultiPage()
app.st = st
app.add_app("Hello World", my_page)
app.run()
多页
处理多页时,工作流程是相同的。如果读取,始终清理输入并确保值可用且正确。
import streamlit as st
from streamlit_multipage import MultiPage
def input_page(st, **state):
st.title("Body Mass Index")
weight_ = state["weight"] if "weight" in state else 0.0
weight = st.number_input("Your weight (Kg): ", value=weight_)
height_ = state["height"] if "height" in state else 0.0
height = st.number_input("Your height (m): ", value=height_)
if height and weight:
MultiPage.save({"weight": weight, "height": height})
def compute_page(st, **state):
st.title("Body Mass Index")
if "weight" not in state or "height" not in state:
st.warning("Enter your data before computing. Go to the Input Page")
return
weight = state["weight"]
height = state["height"]
st.metric("BMI", round(weight / height ** 2, 2))
app = MultiPage()
app.st = st
app.add_app("Input Page", input_page)
app.add_app("BMI Result", compute_page)
app.run()
使用命名空间
在处理多页时,可能会出现变量名冲突,默认情况下,所有变量都保存在名为global
的公共命名空间中,但也可以定义自定义命名空间。一页可以同时写入多个命名空间。
import streamlit as st
from streamlit_multipage import MultiPage
def input_page(st, **state):
namespace = "input"
variables = state[namespace] if namespace in state else {}
st.title("Tax Deduction")
salary_ = variables["salary"] if "salary" in variables else 0.0
salary = st.number_input("Your salary (USD): ", value=salary_)
tax_percent_ = variables["tax_percent"] if "tax_percent" in variables else 0.0
tax_percent = st.number_input("Taxes (%): ", value=tax_percent_)
total = salary * (1 - tax_percent)
if tax_percent and salary:
MultiPage.save({"salary": salary, "tax_percent": tax_percent}, namespaces=[namespace])
if total:
MultiPage.save({"total": total}, namespaces=[namespace, "result"])
def compute_page(st, **state):
namespace = "result"
variables = state[namespace] if namespace in state else {}
st.title("Your Salary After Taxes")
if "total" not in variables:
st.warning("Enter your data before computing. Go to the Input Page")
return
total = variables["total"]
st.metric("Total", round(total, 2))
app = MultiPage()
app.st = st
app.add_app("Input Page", input_page)
app.add_app("Net Salary", compute_page)
app.run()
自动命名空间
如果将命名空间设置为与App名称(add_app
的第一个参数)相同,则状态在发送到函数之前将预先过滤。
import streamlit as st
from streamlit_multipage import MultiPage
def input_page(st, **state):
st.title("Tax Deduction")
salary_ = state["salary"] if "salary" in state else 0.0
salary = st.number_input("Your salary (USD): ", value=salary_)
tax_percent_ = state["tax_percent"] if "tax_percent" in state else 0.0
tax_percent = st.number_input("Taxes (%): ", value=tax_percent_)
total = salary * (1 - tax_percent)
if tax_percent and salary:
MultiPage.save({"salary": salary, "tax_percent": tax_percent}, namespaces=["Input Page"])
if total:
MultiPage.save({"total": total}, namespaces=["Net Salary"])
def compute_page(st, **state):
st.title("Your Salary After Taxes")
if "total" not in state:
st.warning("Enter your data before computing. Go to the Input Page")
return
total = state["total"]
st.metric("Total", round(total, 2))
app = MultiPage()
app.st = st
app.add_app("Input Page", input_page)
app.add_app("Net Salary", compute_page)
app.run()
目录结构
处理多个复杂页面时,将它们都放在一个.py文件中并不方便。此示例显示了如何布局目录结构以拥有一个组织良好的项目。
.
└── root/
├── pages/
│ ├── __init__.py
│ ├── input_data.py
│ └── result.py
└── main.py/
input_data.py
from streamlit_multipage import MultiPage
def input_page(st, **state):
st.title("Tax Deduction")
salary_ = state["salary"] if "salary" in state else 0.0
salary = st.number_input("Your salary (USD): ", value=salary_)
tax_percent_ = state["tax_percent"] if "tax_percent" in state else 0.0
tax_percent = st.number_input("Taxes (%): ", value=tax_percent_)
total = salary * (1 - tax_percent)
if tax_percent and salary:
MultiPage.save({"salary": salary, "tax_percent": tax_percent}, namespaces=["Input Page"])
if total:
MultiPage.save({"total": total}, namespaces=["Net Salary"])
Result.py
def compute_page(st, **state):
st.title("Your Salary After Taxes")
if "total" not in state:
st.warning("Enter your data before computing. Go to the Input Page")
return
total = state["total"]
st.metric("Total", round(total, 2))
__init__.py
from .input_data import input_page
from .result import compute_page
pages = {
"Input Page": input_page,
"Net Salary": compute_page,
}
main.py
from pages import pages
import streamlit as st
from streamlit_multipage import MultiPage
app = MultiPage()
app.st = st
for app_name, app_function in pages.items():
app.add_app(app_name, app_function)
app.run()
着陆页
还可以显示一个仅在启动时显示并随后跳转到主应用的着陆页。着陆页仅提供信息,且无法访问状态。
import streamlit as st
from streamlit_multipage import MultiPage, save
def input_page(st, **state):
"""See Example on Multipage"""
def compute_page(st, **state):
"""See Example on Multipage"""
def landing_page(st):
st.title("This is a Multi Page Application")
st.write("Feel free to leave give a star in the Github Repo")
app = MultiPage()
app.st = st
app.add_app("Landing", landing_page, initial_page=True)
app.add_app("Input Page", input_page)
app.add_app("BMI Result", compute_page)
app.run()
定制
存在额外的功能来定制用户界面。在这个示例中,所有默认文本都被替换成了自定义信息。
import streamlit as st
from streamlit_multipage import MultiPage, save
def input_page(st, **state):
"""See Example on Multipage"""
def compute_page(st, **state):
"""See Example on Multipage"""
def landing_page(st):
"""See Example on Landing Page"""
def footer(st):
st.write("Developed by [ELC](https://elc.github.io)")
def header(st):
st.write("This app is free to use")
def sidebar(st):
st.button("Donate (Dummy)")
app = MultiPage()
app.st = st
app.start_button = "Go to the main page"
app.navbar_name = "Other Pages:"
app.next_page_button = "Next Chapter"
app.previous_page_button = "Previous Chapter"
app.reset_button = "Delete Cache"
app.navbar_style = "SelectBox"
app.header = header
app.footer = footer
app.navbar_extra = sidebar
app.hide_menu = True
app.hide_navigation = True
app.add_app("Landing", landing_page, initial_page=True)
app.add_app("Input Page", input_page)
app.add_app("BMI Result", compute_page)
app.run()
安装
无需安装
这是一个非常简单的脚本,如果不想引入新的和小型依赖项,只需将 src
文件夹的内容复制粘贴到您的项目中(一个单独的文件)。请注意,这种方法不包括使用依赖项的所有优点,例如更新、依赖项跟踪等。
通过Pip
运行以下命令进行安装
pip install streamlit-multipage
唯一的依赖项是 streamlit
,它应该已经安装。如果没有安装,它将自动安装。如果 pickle
模块无法处理保存状态中的对象,则可以选择安装 joblib
。
类似的项目
许多人试图实现多页streamlit应用,因此开发了多个库来实现这个目标。以下列出了一些:
如果这个项目不符合您的需求,请也查看这些。
维护者
该项目由Yan Almeida和Ezequiel Leonardo Castaño维护
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。