サイトアイコン アマチュア無線局JS2IIU

【Streamlit】Streamlitアプリの状態管理:st.session_state

こんにちは、JS2IIUです。
StreamlitはシンプルなコードでWebアプリを作れる便利なPythonライブラリです。しかし、Streamlitには「スクリプトは毎回上から再実行される」という特徴があり、ボタンを押した後の状態や入力値を保持するのが難しいと感じたことはありませんか?

そんなときに活躍するのが st.session_state です。この記事では、st.session_state を使った状態管理の基本から実践的な使い方、さらにはよくあるエラーや開発環境の設定まで、丁寧に解説していきます。

1. st.session_state とは?

st.session_state は、ユーザーごとの「セッション(操作の単位)」ごとに情報を保持できる辞書型のオブジェクトです。
これにより、次のようなことが可能になります:

Streamlitの再実行モデルでは、ボタンを押したりフォームを送信すると、スクリプトが再度最初から実行されるため、普通の変数では状態を保持できません。st.session_state を使えばそれを解決できます。

2. 基本的な使い方

✅ ステップバイステップ:カウントボタンの状態管理

Python
import streamlit as st

# 初期化(最初の実行時のみ)
if 'count' not in st.session_state:
    st.session_state.count = 0

# ボタンが押されたらカウントを増やす
if st.button('カウントアップ'):
    st.session_state.count += 1

# 現在のカウントを表示
st.write(f"現在のカウント: {st.session_state.count}")

🔍 解説:

3. 実践例①:フォームの入力値を保持する

Python
import streamlit as st

# 初期化
if 'name' not in st.session_state:
    st.session_state.name = ''

# 入力と送信
st.text_input("名前を入力してください", key="input_name")

# ボタンで状態を更新
if st.button("送信"):
    st.session_state.name = st.session_state.input_name

# 表示
st.write(f"こんにちは、{st.session_state.name} さん!")

🔍 解説:

4. 実践例②:ページ間で状態を共有する

Streamlitにはページ遷移の仕組みはありませんが、st.radiost.selectbox を使って擬似的にページを切り替えられます。

Python
import streamlit as st

# 初期化
if 'input_text' not in st.session_state:
    st.session_state.input_text = ""

# 擬似ページ選択
page = st.radio("ページ選択", ["入力ページ", "確認ページ"])

if page == "入力ページ":
    st.text_input("メモを入力", key="input_text")

elif page == "確認ページ":
    st.write(f"入力されたメモ:{st.session_state.input_text}")

5. よくあるエラーと対処法

エラー内容原因対処法
AttributeError: 'SessionState' object has no attribute 'xxxxx'キーが存在しない状態で値にアクセス事前に if 'xxxxx' not in st.session_state: で初期化する
KeyError: 'xxxxx'キー名のタイポや未定義タイポを修正。.get() で安全にアクセス
状態が保持されないセッションが切れている、もしくはキー未使用適切にキーを指定し、セッションを維持

6. 開発Tips:VSCodeで快適に開発する設定

✅ VSCode用Streamlit開発手順

ステップ①:仮想環境の作成(推奨)

Python
python -m venv venv
source venv/bin/activate  # Windowsなら venv\Scripts\activate

ステップ②:必要パッケージのインストール

Python
pip install streamlit

ステップ③:VSCodeで仮想環境を選択

ステップ④:Streamlitアプリを実行

Bash
streamlit run app.py

ステップ⑤:ファイルの自動保存を有効にする(おすすめ???)

JSON
{
  "files.autoSave": "onFocusChange"
}

7. まとめ

ぜひ、この記事のコードを参考に、インタラクティブで賢いStreamlitアプリを作ってみてください!

🔗 参考リンク

最後まで読んでいただきありがとうございます。

モバイルバージョンを終了