はじめに
StreamlitはPythonだけでWebアプリケーションが作成できるフレームワークです。
ナビゲーションバーなどを配置してマルチページのような構成をとることもできるのですが、あくまで単一の画面を再レンダリングしているだけなので元のページに戻ると内容がリセットされています。
今回はページ遷移しても同じ内容を保持する方法について記載します。
デモアプリ
ナビゲーションバーを利用して異なる複数の機能を持つアプリケーションです。(multiselecterでdfの列を選択する)
ページを切り替えだ後、元のページに戻ってきても選択した内容が、切り替えた時点の状態で表示されます。
やり方
st.session_state
を使います。
ポイントは以下3点です。
- すべてのウィジェットの入力値をst.session_stateで保持する。
- ウィジェットの初期値をst.session_stateにする。
python
# st.session_stateで入力値を保持する
st.session_state.select1 = st.multiselect(
"select",
options=st.session_state.df.columns.values,
key="s1",
# 初期値をst.session_stateにする
default=st.session_state.select1,
)
- st.session_stateの初期化時はウィジェットに応じた初期値を設定する。
python
if "df" not in st.session_state:
st.session_state.df = pd.DataFrame(
data=np.random.randint(0, 10, (1000, 10)), columns=range(10)
)
st.session_state.select1 = []
st.session_state.select2 = []
コード全体
multipage_state.py
import numpy as np
import pandas as pd
import streamlit as st
from streamlit_option_menu import option_menu
selected = option_menu(
None,
["page1", "page2"],
default_index=0,
orientation="horizontal",
)
if "df" not in st.session_state:
st.session_state.df = pd.DataFrame(
data=np.random.randint(0, 10, (1000, 10)), columns=range(10)
)
st.session_state.select1 = []
st.session_state.select2 = []
if selected == "page1":
st.session_state.select1 = st.multiselect(
"select",
options=st.session_state.df.columns.values,
key="s1",
default=st.session_state.select1,
)
df = st.session_state.df[st.session_state.select1]
st.dataframe(df)
if selected == "page2":
st.session_state.select2 = st.multiselect(
"select",
options=st.session_state.df.columns.values,
key="s2",
default=st.session_state.select2,
)
df = st.session_state.df[st.session_state.select2]
st.dataframe(df)
おわりに
マルチページにしたはいいものの、ページを何回も行き来するのでいちいち内容が消えて欲しくない!というときに使えると思います。