Попытка сохранить Statefulness для виджета `st.dataframePython

Программы на Python
Anonymous
Попытка сохранить Statefulness для виджета `st.dataframe

Сообщение Anonymous »

фон < /h1>
У меня есть многочисленное приложение по стриме со следующей структурой каталога проекта: < /p>

Код: Выделить всё

├── Home.py
├── utils.py
├── Pages
│   ├── Data_Entry.py
< /code>
Это многостраничное приложение, в котором я пытаюсь сохранить Statefulness виджетов в скрипте data_entry.py. < /p>
Для Ради этого обсуждения у меня есть два виджета, виджет текстового ввода и виджет селектора данных, в data_entry.py 
. Я смог выяснить, как сохранить состояние Statefullness текстового ввода виджета при навигации между home.py и 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()
Вот код из 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= ""
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 
. Вот фрагмент кода для виджетов DataFrame: < /p>

Код: Выделить всё

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(
^^^^^^^^^^^^^
Я не уверен, почему подход, который работает для виджета Text_input, не работает для виджета St.DataFrame . Какой бы подход я использовал для хранения состояния сеанса, эта ошибка никогда не останавливается. Что я делаю не так? Это особенно сбивает с толку, потому что у меня есть рабочий подход для другого виджета. H3>
Я пытаюсь передать аргумент в 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
остается прежним. Это создает другую ошибку: < /p>

Код: Выделить всё

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

Вернуться в «Python»