Lekcja 12 - webGUI, Streamlit (notatki)

Lekcja 12 - webGUI, Streamlit (notatki)

Gdy przeglądamy strony internetowe, to niezależnie od przeglądarki czy systemu wyglądają one podobnie. Wynika to z tego, że dość konsekwentne są opisy stron internetowych. Stąd warto się zastanowić nad przygotowaniem aplikacji pod przeglądarkę, którą możemy opublikować w sieci i która niezależnie od odbiorcy będzie wyglądała podobnie.

Streamlit

Streamlit to zestaw bibliotek umożliwiających stworzenie frameworku do pracy z danymi. Nie trzeba do niego opanowywać innych języków programowania, wystarczy python. Ma jednak jedną wadę, dość ciężko go spersonalizować, ponieważ wiele rzeczy jest odgórnie ustalone np. wielkość i kolor nagłówków.

By zacząć z niego korzystać musimy wpierw zainstalować tę bibliotekę poprzez wpisanie do terminala: pip install streamlit. Potem na początku aplikacji trzeba się do niego odwołać poprzez import streamlit as st, i wpisać samą aplikację.


Uwaga! Tę aplikację trzeba uruchamiać przez przeglądarkę, robi się to poprzez wpisanie w terminalu: streamlit run nazwa_aplikacji.py. Niekiedy przez konfigurację komputera nie jest to możliwe, w takiej sytuacji można skorzystać z darmowej stronki replit, by obejrzeć swoją aplikację w przeglądarce.


Teraz warto zapoznać się z dokumentacją streamlita, która jest dostępna online, a następnie spróbujemy stworzyć pierwszą, podstawową aplikację webową:

import streamlit as st

st.set_page_config(page_title="Moja aplikacja")
st.title("Jakiś tytuł")

Teraz zobaczymy jak stworzyć komponenty tekstowe:

st.title("Twój tytuł")
st.header("Twój nagłówek")
st.subheader("Podnagłówek")
st.write("zwykły tekst")

Tytuły i nagłówki, można też wpisywać przy pomocy Markdowna (więcej o Markdownie tutaj):

st.write("""Zwykły tekst
#Tytuł H1
##Nagłówek H2""")

Możemy też wstawić komponenty wymagające interakcji od użytkownika:

pole_tekstowe = st.text_input(label="Podaj imię: "

Pole do wprowadzania danych

suwak = st.slider(label=Suwak, min_value=0, max_value=100)

Pole suwaka

kratka = st.checkbox(label="Kratka")

Pole wyboru ("ptaszek")

zwierzeta = ["pies", "kot", "chomik", "rybki"]
wybor = st.multiselect(label="Wybierz swoje zwierze", options = zwierzeta)

Wybieranie z rozsuwanych opcji

Oraz komponenty do wykresów:

st.bar_chart

Wykres słupkowy

import pandas as pd
import streamlit as st

st.write("Wykres słupkowy na podstawie csv")
news_df = pd.read_csv("Twoj_plik.csv")
print(news_df)
print(type(news_df))
print(news_df.dtypes)

st.bar_chart(news_df, x=Show)

Przykład wykresu słupkowego na podstawie csv

Kolejnym komponentem jest wstawianie obrazków

st.image("obrazek.jpg")

Oraz przycisk

przycisk = st.button(label = "Wciśnij mnie!")

Choć Streamlit potrafi zbierać dane od użytkownika to w momencie odświeżenia strony (czyli przy każdorazowym użyciu komponentów), tracimy wszystkie wprowadzone wcześniej dane. Stąd w momencie gdy chcemy zapobiec utraceniu danych musimy skorzystać z bardziej skomplikowanych struktur jak formularz.

import streamlit as st

def zliczaj_slowa(tekst:str) -> int:
  slowa_lista = tekst.split()
  ilosc_slow = len(slowa_lista)
  return ilosc_slow

#lub krócej: return len(slowa_lista)

st.title("Zliczaj słowa")
st.write("Aplikacja zlicza ilość słów wprowadzonych w pole tekstowe")
pole_tekstowe = st.text_area(label="Wprowadź tekst: ")
zliczaj_przycisk = st.button("Zliczaj")
if zliczaj_przycisk:
  ilosc_slow = zliczaj_slowa(pole_tekstowe)
  st.write(f"Ilosc slow: {ilosc_slow}")

Ćwiczenie

Stwórz aplikację "rzucającą monetą"

import streamli as st
import random

obrazki = ("orzel.jpg", "reszka.jpg")
     
przycisk_rzut = st.button(label = "Wciśnij mnie!")
if przycisk_rzut:
    st.image(random.choice(obrazki))

Stwórz aplikację "rzucającą" kością, uwzględnij możliwość wybierania ilości kości i ich rodzaju (ile ścianek):

import random

losowa_liczba = random.randit(1, 6)
#losuje liczbę od 1 do 6 włącznie

st.write(liczba)

Przykład jak wprowadzić losowanie numerów

import random

print("Rzuć kością")
ilosc_scianek = int(input("Wprowadź liczbę: "))
ilosc_kostek = int(input("Wprowadź liczbę: "))

for losowa_liczba in range(ilosc_kostek):
    losowa_liczba = random.randint(1, ilosc_scianek)
    print(losowa_liczba)

Jak zrobić taką aplikację w pythonie

st.title("Rzuć kością")
ilosc_scianek = st.slider('Wybierz liczbę ścianek', 1, 30)
ilosc_kostek = st.slider('Wybierz liczbę kości', 1, 10)

przycisk_rzut_koscia = st.button(label = "Rzut kością!")
if przycisk_rzut_koscia:
    for losowa_liczba in range(ilosc_kostek):
      losowa_liczba = random.randint(1, ilosc_scianek)
      st.write(losowa_liczba)