スポンサーリンク

【Streamlit】Selectboxの状態をセッションに保持する方法

記事内に広告が含まれています。

Streamlitのst.selectboxは、ページをリロードすると選択状態が初期化される仕様になっています。

しかし、アプリの操作中にページを遷移しても、選択した値を維持したいケースがあるでしょう。

本記事では、StreamlitのSession Stateを活用してselectboxの状態を保持する方法をまとめます。

スポンサーリンク

セッションステートとは?

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_optionst.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_optionselectboxの初期値として使用します。
  • 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() を活用して即時反映
スポンサーリンク
PythonStreamlit
著者SNS
タイトルとURLをコピーしました