ここを参考に。
qiita.com
以下のsession.pyを使う。
github.com
Streamlitのバージョンが上がって動かなかったので以下のように修正した
session.py
from streamlit.runtime.scriptrunner.script_run_context import get_script_run_ctx from streamlit.runtime import get_instance class _SessionState: def __init__(self, session): """Initialize SessionState instance.""" self.__dict__["_state"] = { "data": {}, "hash": None, "hasher": None, "is_rerun": False, "session": session, } def __call__(self, **kwargs): """Initialize state data once.""" for item, value in kwargs.items(): if item not in self._state["data"]: self._state["data"][item] = value def __getitem__(self, item): """Return a saved state value, None if item is undefined.""" return self._state["data"].get(item, None) def __getattr__(self, item): """Return a saved state value, None if item is undefined.""" return self._state["data"].get(item, None) def __setitem__(self, item, value): """Set state value.""" self._state["data"][item] = value def __setattr__(self, item, value): """Set state value.""" self._state["data"][item] = value def clear(self): """Clear session state and request a rerun.""" self._state["data"].clear() self._state["session"].request_rerun() def sync(self): """Rerun the app with all state values up to date from the beginning to fix rollbacks.""" # Ensure to rerun only once to avoid infinite loops # caused by a constantly changing state value at each run. # # Example: state.value += 1 if self._state["is_rerun"]: self._state["is_rerun"] = False elif self._state["hash"] is not None: if self._state["hash"] != self._state["hasher"].to_bytes(self._state["data"], None): self._state["is_rerun"] = True self._state["session"].request_rerun() self._state["hash"] = self._state["hasher"].to_bytes(self._state["data"], None) def _get_session(): runtime = get_instance() session_id = get_script_run_ctx().session_id session_info = runtime._session_mgr.get_session_info(session_id) if session_info is None: raise RuntimeError("Couldn't get your Streamlit Session object.") return session_info.session def _get_state(): session = _get_session() if not hasattr(session, "_custom_session_state"): session._custom_session_state = _SessionState(session) return session._custom_session_state
本体ファイル
app.py
import streamlit as st from session import _get_state state = _get_state() if state.count == None: state.count = 0 def main(): st.title('Counter App') count = 0 increment_count = st.button('count +') decrement_count = st.button('count -') if increment_count: state.count += 1 if decrement_count: state.count -= 1 st.write(f'count: {state.count}') if __name__ == '__main__': main()