У меня есть многочисленное приложение по стриме со следующей структурой каталога проекта: < /p>
Код: Выделить всё
├── Home.py
├── utils.py
├── Pages
│ ├── Data_Entry.py
< /code>
Это многостраничное приложение, в котором я пытаюсь сохранить Statefulness виджетов в скрипте data_entry.py. < /p>
Для Ради этого обсуждения у меня есть два виджета, виджет текстового ввода и виджет селектора данных, в data_entry.py Однако подход Я использую для сохранения государственного виджета текстового ввода не работает для виджета St.DataFrame . Ясность:
data_entry.py
Код: Выделить всё
import streamlit as st
import utils as ut
ut.init_session_state()
def main():
st.markdown("### ProcessName")
ut.load_value("process_name_widget")
st.text_input(
"Enter the process' name here.",
help="Enter a concise name for the process here.",
max_chars=50,
key="_process_name_widget",
on_change=ut.store_value,
args=["process_name_widget"],
)
process_name= st.session_state._process_name_widget
if __name__ == "__main__":
main()
Код: Выделить всё
import streamlit as st ## Streamlit
def init_session_state():
"""
This function initiates the session state for the Streamlit app.
"""
if "process_name_widget" not in st.session_state:
st.session_state.process_name_widget= ""
load_value("process_name_widget")
def store_value(key):
st.session_state[key] = st.session_state[f"_{key}"]
def load_value(key):
st.session_state[f"_{key}"] = st.session_state[key]
< /code>
Этот подход для состояния ввода текстового ввода работает отлично. из виджета St.dataframe Код: Выделить всё
Data_Entry.pyКод: Выделить всё
### Same as for the previous snippet for Data_entry.py
import streamlit as st
import utils as ut
ut.init_session_state()
def main():
### The text_input widget code precedes this section
ut.load_value("team_selection_widget")
team_selection = st.dataframe(
teams_result_df,
use_container_width= True,
hide_index=True,
on_select=ut.store_value,
column_order=("team", "context"),
column_config={"team": "Team Abbreviation", "context": "Team Context"},
selection_mode="single-row",
key = "_team_selection_widget"
)
if __name__ == "__main__":
main()
< /code>
Вот измененный код для utils.py:образнойimport streamlit as st ## Streamlit
def init_session_state():
"""
This function initiates the session state for the Streamlit app.
"""
if "process_name_widget" not in st.session_state:
st.session_state.process_name_widget= ""
if "team_selection_widget" not in st.session_state:
st.session_state.team_selection_widget = ""
load_value("process_name_widget")
load_value("team_selection_widget")
def store_value(key):
st.session_state[key] = st.session_state[f"_{key}"]
def load_value(key):
st.session_state[f"_{key}"] = st.session_state[key]
< /code>
Единственное изменение - это то, что я обновил init_session_state (). Я получаю эту ошибку: < /p>
StreamlitAPIException: Values for the widget with key '_team_selection_widget' cannot be set using st.session_state.
Traceback:
File "/home/Data_Entry.py", line 342, in
main()
File "/home/Data_Entry.py", line 67, in main
team_selection = st.dataframe(
^^^^^^^^^^^^^
Я пытаюсь передать аргумент в STORE_VALUE < /code> следующим образом: < /p>
Код: Выделить всё
def main():
### The text_input widget code precedes this section
ut.load_value("team_selection_widget")
team_selection = st.dataframe(
teams_result_df,
use_container_width= True,
hide_index=True,
on_select=ut.store_value(key="team_selection_widget"),
column_order=("team", "context"),
column_config={"team": "Team Abbreviation", "context": "Team Context"},
selection_mode="single-row",
key = "_team_selection_widget"
)
if __name__ == "__main__":
main()
< /code>
utils.pyКод: Выделить всё
StreamlitAPIException: You have passed None to on_select. But only 'ignore', 'rerun', or a callable is supported.
Traceback:
File "/home/Data_Entry.py", line 342, in
main()
File "/home/Data_Entry.py", line 67, in main
team_selection = st.dataframe(
^^^^^^^^^^^^^
Ни один из предыдущих вопросов конкретно не говорит конкретно о виджете St.dataframe . Кроме того, у меня есть подход, который работает для одного виджета, не работает для другого виджета, который кажется уникальным.
Подробнее здесь: https://stackoverflow.com/questions/794 ... -multipage