Streamlitのst.selectboxは、ページをリロードすると選択状態が初期化される仕様になっています。
しかし、アプリの操作中にページを遷移しても、選択した値を維持したいケースがあるでしょう。
本記事では、StreamlitのSession Stateを活用してselectboxの状態を保持する方法をまとめます。
Contents
セッションステートとは?
Streamlitのセッションステート(Session State)を利用すると、ユーザーが選択した値や入力したデータを保持できます。
通常、selectboxを使用すると、ページをリロードした際に選択状態がリセットされますが、st.session_stateを使うことで、ページを移動しても選択値が維持されます。
サンプルコード
以下のコードでは、selectboxの選択状態をst.session_stateに保存し、ページを移動しても選択がリセットされないようにしています。
import streamlit as st
# セッションステートに選択値を保持
if "selected_option" not in st.session_state:
st.session_state.selected_option = "選択してください"
if "page" not in st.session_state:
st.session_state.page = "page1"
# 選択値をセッションステートに保存する関数
def update_selected():
st.session_state.selected_option = st.session_state.selectbox_value
# ページ遷移のためのボタン
if st.session_state.page == "page1":
st.write("## メインページ")
selected_option = st.selectbox(
"オプションを選択してください",
["選択してください", "オプション1", "オプション2", "オプション3"],
index=["選択してください", "オプション1", "オプション2", "オプション3"].index(st.session_state.selected_option),
key="selectbox_value",
on_change=update_selected
)
st.write(f"現在の選択: {st.session_state.selected_option}")
if st.button("別のページへ移動"):
st.session_state.page = "page2"
st.rerun()
elif st.session_state.page == "page2":
st.write("## 別のページ")
st.write("このページでは Selectbox は表示されません。")
if st.button("メインページへ戻る"):
st.session_state.page = "page1"
st.rerun()
コードの解説
セッションステートの初期化
if "selected_option" not in st.session_state:
st.session_state.selected_option = "選択してください"
if "page" not in st.session_state:
st.session_state.page = "page1"
この部分で、アプリが初めて実行された際にst.session_state.selected_optionとst.session_state.pageを初期化しています。
選択値をセッションステートに保存
def update_selected():
st.session_state.selected_option = st.session_state.selectbox_value
この関数は、selectboxの値が変更された際にセッションステートに保存するためのものです。
selectbox の状態を維持しつつ、ページ遷移時に非表示
if st.session_state.page == "page1":
selected_option = st.selectbox(
"オプションを選択してください",
["選択してください", "オプション1", "オプション2", "オプション3"],
index=["選択してください", "オプション1", "オプション2", "オプション3"].index(st.session_state.selected_option),
key="selectbox_value",
on_change=update_selected
)
st.session_state.pageに基づいてselectboxの表示・非表示を切り替えます。st.session_state.selected_optionをselectboxの初期値として使用します。keyはセッションステートのキーと対応します。on_changeに設定した関数が選択肢変更時に呼び出されます。
ページ遷移の制御
if st.button("別のページへ移動"):
st.session_state.page = "page2"
st.rerun()
st.session_state.pageを利用して、ページの状態を管理st.rerun()を使い、即座にページを切り替え
まとめ
この方法を使うと、Streamlitアプリ内でページを移動してもselectboxの選択状態を保持しつつ、 異なるページでは selectbox を非表示にできます。
st.session_stateを使ってselectboxの値を保存するkeyを設定してセッションステートと連携させるon_changeを利用してセッションステートを更新するst.session_state.pageを使ってページごとにUIを変えるst.rerun()を活用して即時反映
