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

Streamlit
この記事は約5分で読めます。

こんにちは、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}")

🔍 解説:

  • if 'count' not in st.session_state: で初期値を設定します。
  • ボタンを押すたびに count をインクリメント。
  • スクリプトが再実行されても、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} さん!")

🔍 解説:

  • 入力値は key="input_name"st.session_state.input_name に格納されます。
  • ボタンが押されたら 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で仮想環境を選択

  • 右下のPython環境をクリックし、./venv/bin/python を選ぶ

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

Bash
streamlit run app.py

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

  • VSCodeの設定で files.autoSaveonFocusChange にすると便利
  • ご自身の使い方にマッチするかよく確かめて、使うかどうか判断しましょう
JSON
{
  "files.autoSave": "onFocusChange"
}

7. まとめ

  • st.session_state はStreamlitアプリで「状態を保持」するための強力なツールです。
  • ボタンの状態、入力内容、ページ間のデータ共有などに使えます。
  • 初期化忘れやタイポには注意が必要です。
  • VSCodeの仮想環境・自動保存設定を整えると、開発がぐっと快適になります。

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

🔗 参考リンク

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

コメント

タイトルとURLをコピーしました