Если вы использовали Streamlit для создания своего веб-приложения для обработки данных или машинного обучения, возможно, вы уже знаете, что всякий раз, когда какое-либо интерактивное изменение вызывается через виджеты приложения, веб-приложение Streamlit повторно запускается с самого верха в конец вашего скрипта Python.
В этой статье я попытаюсь выделить те возможные обходные пути с фрагментами кода и примерами использования, которые, безусловно, помогут преодолеть это внутреннее поведение веб-приложения Streamlit.
👨🏾💻 GitHub ⭐️| 🐦 Твиттер | 📹 Ютуб | ☕️ КупиКофе | Ко-фи💜
Поведение по умолчанию любого веб-приложения Streamlit (линейный поток)
Давайте напишем очень простое приложение Streamlit, построим списки фруктов 🍌 🍎 🥭 и продемонстрируем стандартное поведение линейного потока ⏬ любого веб-приложения Streamlit.
# ---- Modules ------- import streamlit as st import pandas as pd import plotly.express as px st.header("Fruits List") # ---- Creating Dictionary ---- _dic = { 'Name': ['Mango', 'Apple', 'Banana'], 'Quantity': [45, 38, 90]} load = st.button('Load Data') if load: _df = pd.DataFrame(_dic) st.write(_df) # ---- Plot types ------- opt = st.radio('Plot type :',['Bar', 'Pie']) if opt == 'Bar': fig = px.bar(_df, x= 'Name', y = 'Quantity',title ='Bar Chart') st.plotly_chart(fig) else: fig = px.pie(_df,names = 'Name', values = 'Quantity',title ='Pie Chart') st.plotly_chart(fig)
Если мы наблюдаем поведение в приведенном выше веб-приложении, как только срабатывает один из переключателей, т. Е. Здесь, переключатель "Pie"
, мы не видим ожидаемого результата, то есть наших круговых диаграмм. Это связано с тем, что кнопка"Load Data"
находится в неактивном состоянии, поскольку сценарий перезапускается 🔄 из-за срабатывания переключателя.
Как это можно исправить и какие возможны обходные пути?
Использование виджета флажка Streamlit ☑️
Простое и быстрое решение (не идеальное с точки зрения пользовательского интерфейса!) состоит в том, чтобы заменить виджет с "Load Data"
кнопкой на виджет с флажком, используя синтаксис st.checkbox
. Это включает активное состояние последующего скрипта для приложения. Что это значит ? Позвольте мне продемонстрировать это.
Управление виджетом кнопки ⏹ Streamlit с помощью SessionState
Другим обходным решением является комбинация виджета кнопки вместе с SessionState,st.session_state
. Чтобы контролировать состояние кнопки"Load Data"
, мы будем использовать SessionState,st.session_state
. Это сохранит активное состояние кнопки. несмотря на триггер от изменения опции переключателя.
Интересуетесь изменениями в коде? давайте рассмотрим это,
Кроме того, давайте не забудем инициализировать st.session_state
.
# --- Initialising SessionState --- if "load_state" not in st.session_state: st.session_state.load_state = False ... ...
Включение кода в функцию
Иногда вы не хотите, чтобы ваша вычислительная часть перезапускалась при каждом изменении виджета, верно? Завершение вычислительной части вашего кода в рамках одной функции поможет вам в этом, наряду с использованием синтаксиса st.experimental_memo
или st.cache
. Также обратитесь к официальному doc.
Давайте поработаем с кодом и поместим его в одну функцию.
Таким образом, приведенные выше несколько обходных путей, безусловно, помогут в настройке линейного рабочего процесса Streamlit и помогут поддерживать желаемое состояние веб-приложения в зависимости от потребностей.
Вот мое видео, связанное с этой статьей -
Эй! Меня зовут Авра, и мне нравится писать коды и делиться ими со всеми. Я сделал несколько связанных с Streamlit видео, которые могут быть интересны и вам. Пожалуйста, ознакомьтесь с ними и не стесняйтесь делиться своими отзывами!
👨🏾💻 GitHub ⭐️| 🐦 Твиттер | 📹 Ютуб | ☕️ КупиКофе | Ко-фи💜
Вот еще одно видео о Streamlit-Python Tricks, которое я сделал,