Если вы использовали 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 видео, которые могут быть интересны и вам. Пожалуйста, ознакомьтесь с ними и не стесняйтесь делиться своими отзывами!

Также хотите стать моим участником Patreon? — вы заранее получите доступ к эксклюзивному контенту, кодам или видео, индивидуальной разработке веб-приложений / соответствующему обсуждению, живому чату со мной по конкретным видео и другим преимуществам. (К вашему сведению: базовый уровень на 50 % дешевле, чем ChatGPT/ежемесячно, с преимуществами, с которыми ИИ не может помочь 😉)

👨🏾‍💻 GitHub ⭐️| 🐦 Твиттер | 📹 Ютуб | ☕️ КупиКофе | Ко-фи💜

Вот еще одно видео о Streamlit-Python Tricks, которое я сделал,