import streamlit as st class StatefulWidgets: """ A class to create Streamlit widgets with encapsulated session state management. """ def __init__(self, prefix: str = "_"): """ Initializes the StatefulWidgets class. Args: prefix (str): A prefix to use for the widget's internal session state key. """ self.prefix = prefix def _store_value(self, key: str) -> None: """ Callback function to store the widget's value from the internal state to the main session state. """ st.session_state[key] = st.session_state[f"{self.prefix}{key}"] def _initialize_and_load(self, key: str, initial_value) -> None: """ Initializes the session state for a given key if it doesn't exist, and then loads this value into the widget's internal state. """ if key not in st.session_state: st.session_state[key] = initial_value st.session_state[f"{self.prefix}{key}"] = st.session_state[key] def create(self, widget_func, key: str, *args, initial_value=None, **kwargs): """ Creates a Streamlit widget and binds its state. Args: widget_func: The Streamlit widget function (e.g., st.text_input). key (str): The key for the main session state. *args: Positional arguments to pass to the widget function. initial_value: The initial value to set in the session state if not present. **kwargs: Keyword arguments to pass to the widget function. Returns: The created Streamlit widget. """ self._initialize_and_load(key, initial_value) return widget_func( *args, key=f"{self.prefix}{key}", on_change=self._store_value, args=(key,), **kwargs, )