LoginSignup
2
6

More than 1 year has passed since last update.

ページ遷移しても状態を維持したい(Streamlit)

Posted at

はじめに

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)

おわりに

マルチページにしたはいいものの、ページを何回も行き来するのでいちいち内容が消えて欲しくない!というときに使えると思います。

2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6