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()
を活用して即時反映