Streamlitでは、アプリケーションの再レンダリングが行われるたびに、ウィジェットの状態や入力データがリセットされてしまいます。
この問題を解決するために利用できるのがsession_state
です。
セッション間で状態を保持し、インタラクティブなアプリケーションを構築できます。
基本的な使い方
session_state
は、Streamlitのセッションごとにデータを保持するための辞書型のオブジェクトです。
このオブジェクトを使って、ユーザーの操作や計算結果を保存し、再利用できます。
以下では、st.session_state
を利用してカウンターを実装する例を紹介します。
コード例
import streamlit as st
# 初期化: セッション状態がまだ存在しない場合に初期値を設定
if 'count' not in st.session_state:
st.session_state.count = 0
# ボタンを押すとカウントが増える
if st.button('増やす'):
st.session_state.count += 1
# カウンターのリセット
if st.button('リセット'):
st.session_state.count = 0
# 現在のカウントを表示
st.write(f"現在のカウント: {st.session_state.count}")
実行結果
- 「増やす」ボタンをクリックするとカウントが1ずつ増えます。
- 「リセット」ボタンを押すとカウントが0に戻ります。
- ページを再読み込みしても状態は維持されます。
ウィジェットの状態を保持する
セッション状態を利用して、ウィジェットの選択内容を保持することも可能です。
コード例
import streamlit as st
# 初期化
if 'selected_option' not in st.session_state:
st.session_state.selected_option = 'Option 1'
# セッション状態に基づいて初期値を設定
selected = st.radio(
"オプションを選択してください:",
['Option 1', 'Option 2', 'Option 3'],
index=['Option 1', 'Option 2', 'Option 3'].index(st.session_state.selected_option)
)
# 状態を更新
st.session_state.selected_option = selected
# 結果を表示
st.write(f"現在選択されているオプション: {st.session_state.selected_option}")
実行結果
ウィジェットの選択状態がセッション内で保持され、ページの再レンダリングでも値が変わりません。
実用例 入力フォームの状態管理
フォームに入力された値を保持することで、ページを再レンダリングしても入力内容を失わないようにできます。
コード例
import streamlit as st
# 初期化
if 'user_input' not in st.session_state:
st.session_state.user_input = ""
# コールバック関数
def update_input():
st.session_state.user_input = st.session_state.input_box
# テキスト入力
st.text_input(
"名前を入力してください:",
key="input_box",
value=st.session_state.user_input,
on_change=update_input
)
# 入力内容を表示
st.write(f"こんにちは、{st.session_state.user_input}さん!")
実行結果
テキストボックスに入力された名前が保持され、再レンダリングしても消えません。
注意点
- メモリ使用量の管理
st.session_state
に大量のデータを保持し続けると、メモリ使用量が増加する可能性があります。- 古いデータは適宜削除するか、不要なデータを保持しないように設計しましょう。
- データ型の整合性
st.session_state
は辞書型ですが、値としてリストや辞書などの複雑なデータ型も保存できます。保存したデータ型が意図した通りであることを確認してください。
- ページ間での共有
- Streamlitのマルチページアプリケーションで
st.session_state
を利用する場合、ページ間でデータが共有されます。この特性を活用して情報を引き継げます。
- Streamlitのマルチページアプリケーションで
実用例 シンプルなToDoリスト
以下は、st.session_state
を活用してToDoリストを構築する例です。
import streamlit as st
# 初期化
if 'tasks' not in st.session_state:
st.session_state.tasks = []
# タスクの追加
new_task = st.text_input("新しいタスクを入力してください:")
if st.button("タスクを追加"):
if new_task:
st.session_state.tasks.append(new_task)
st.rerun() # 再レンダリング
# タスクの表示
if st.session_state.tasks:
st.write("ToDoリスト:")
for i, task in enumerate(st.session_state.tasks, start=1):
st.write(f"{i}. {task}")
else:
st.write("ToDoリストは空です。")
まとめ
session_state
は、Streamlitでインタラクティブなアプリケーションを構築する際に有用です。入力データや計算結果、ウィジェットの状態を保持することで、ユーザー体験を向上させることができます。適切な初期化と状態管理を行い、効率的に使用しましょう。