Python - zajęcia 12

Python - zajęcia 12
Photo by David Clode / Unsplash

1) Ping-Pong rozwiązanie

from pgzero.builtins import *
from pgzero_api_stub import screen
import pgzrun

class Paletka(Actor):
    def __init__(self, obrazek, polozenie):
        super().__init__(obrazek, polozenie)
        pass

    def gora(self):
        if self.top > 5:
            self.y -=8

    def dol(self):
        if self.bottom < HEIGHT-5:
            self.y += 8


class TablicaPunktow:
    def __init__(self, pkt1:int = 0, pkt2:int=0) -> None:
        self.punkty_gracza1 = pkt1
        self.punkty_gracza2 = pkt2
        
    def liczenie_punktow(self):

        if pilka.x <= 0 :
            self.punkty_gracza2 += 1
        
        if pilka.x >= WIDTH:
            self.punkty_gracza1 += 1
        
        screen.draw.text(f"{self.punkty_gracza1}:{self.punkty_gracza2}", (WIDTH/2, 20), fontsize = 32)
        
class Pilka(Actor):
    def __init__(self, obrazek, polozenie) -> None:
        super().__init__(obrazek, polozenie)
        self.przemiex = 5
        self.przemiey = 5
        
    def przemiesc_pileczke(self):
        self.x += self.przemiex
        self.y += self.przemiey
        if self.x >= WIDTH or self.x <=0:
            self.przemiex *= -1

        if self.y > HEIGHT or self.y <=0:
            self.przemiey *= -1

        if pilka.colliderect(paletka_gracz1):
            self.przemiex*=-1

        if pilka.colliderect(paletka_gracz2):
            self.przemiex*=-1


def sterowanie():
    if keyboard.w:
        paletka_gracz1.gora()
    if keyboard.s:
        paletka_gracz1.dol()
    if keyboard.UP:
        paletka_gracz2.gora()
    if keyboard.DOWN:
        paletka_gracz2.dol()

def dzwieki():
    if pilka.colliderect(paletka_gracz1) or pilka.colliderect(paletka_gracz2):
        sounds.hit_paletka.play()
    if pilka.x <= 0:
        sounds.hit_sciana.play()
    if pilka.x >= WIDTH:
        sounds.hit_sciana.play()
    if pilka.y <= 0:
        sounds.hit_sciana.play()
    if pilka.y > HEIGHT:
        sounds.hit_sciana.play()

# stworzenie zmiennych i obiektów

WIDTH = 800
HEIGHT = 600
paletka_gracz1 = Paletka("paletka", (10, HEIGHT / 2))
paletka_gracz2 = Paletka("paletka", (WIDTH - 10, HEIGHT / 2))
pilka = Pilka("pilka", (WIDTH / 2, HEIGHT / 2))
tablica = TablicaPunktow()
velx = 5
vely = 5


def draw():
    screen.fill((0, 0, 0))
    paletka_gracz1.draw()
    paletka_gracz2.draw()
    tablica.liczenie_punktow()
    pilka.draw()


def update():
    sterowanie()
    pilka.przemiesc_pileczke()
    dzwieki()


pgzrun.go()

2) Replit

Umożliwia programowanie w przeglądarce.

Replit – Build software faster
Replit is an AI-powered software development & deployment platform for building, sharing, and shipping software fast.

Wymaga instalacji. Potem klikamy "Create Repl".

3) Co jest nie tak z bibliotekami GUI?

  • nie zawsze wyglądają dobrze na każdym z systemów operacyjnych
  • czasami wymagają osobnego "dopieszczania" pod każdą z platform
  • potrafią być niekonsekwentne w budowie (np. patrz - left / right, n/e w TkInter)

4) Strony WWW?

  • w większości wypadków wyglądają bardzo podobnie niezależnie od systemu / przeglądarki
  • oparte o dość dobrze opisane standardy i technologie

Jest cała grupa aplikacji, które są tak naprawdę stroną www dostarczoną razem z bardzo "odchudzoną" przeglądarką np.

  • Discord
  • Slack
  • Notion
  • Postman
  • WhatsApp
  • MS Teams

Stąd warto poznać jakiś framework web-owy - jest szansa, że z jego pomocą stworzymy nie tylko stronę, ale również aplikację na komputery stacjonarne.

5) Streamlit
https://streamlit.io/

Biblioteka / framework stworzona z myślą o budowaniu stron do pracy z danymi, czy machine learning. Stąd też jego mocną stroną są różnej maści panele informacyjne.

Umożliwia zbudowanie strony bez potrzeby napisania nawet linijki HTML-a / Javascriptu - wszystko przygotowujemy w Pythonie.

Wystarczy zaimportować bibliotekę, skorzystać z gotowych komponentów i uruchomić aplikację poprzez streamlit run.

  1. Krok pierwszy - instaluj:
pip install streamlit
  1. Wykorzystaj bibliotekę w programie pythonowym:
import streamlit as st
st.write("Hello World!")
  1. Uruchom:
streamlit run myapp.py

6) U mnie nie działało uruchomienie, co wtedy?

Prawym kliknąć na plik w którym piszesz i klikasz "Otwórz w zintegrowanym terminalu". Potem to co niżej i enter kilka razy:

7) Podstawowe komponenty

https://docs.streamlit.io/develop/api-reference

  • st.write("tekst")
  • st.title(), st.header(), st.subheader()
  • st.dataframe()
  • st.text_input()
  • st.line_chart(dataframe), st.bar_chart(dataframe)
  • st.button()
  • st.checkbox()
  • st.multiselect()
  • st.slider()
  • st.image()
  • st.balloons()

7) Komponenty "tekstowe"

  • st.write("tekst") - jeden z najbardziej uniwersalnych komponentów umożliwia wyświetlanie tekstu, markdownu, ramek danych, obrazków
  • st.title("tekst") - umożliwia stworzenie tytułu (H1)
  • st.header("tekst") - nagłówek, można dodać parametr divider, który doda podkreślenie
  • st.subheader("tekst") - H3

8) Zadania z zajęć - przykłady

Zaczynamy od potrzebnych importów

import streamlit as st
import pandas as pd
import numpy as np

a) Komponenty tekstowe - write, header, subheader

st.set_page_config(page_title="Zajęcia 12")
# st.title("Jakiś tytuł")
# st.header("A to nagłówek")
st.write("# to H1")
st.write("## to naglowek")

b) Pole do wprowadzania danych - text_input

moj_wpis = st.text_input(label="To jest text input")

c) Suwak - slider

age = st.slider("How old are you?", 0, 130, 25)
st.write("I'm ", age, "years old")

d) Checkbox - checkbox

agree = st.checkbox(" I agree")
if agree:
    st.write("Great!")

e) Multiselect

zwierzeta = ["pies", "kot", "chomik", "rybki"]
moj_multiselect = st.multiselect(label="Wybor zwierzat", options=zwierzeta,)

st.write(f"Wybrano: {moj_multiselect}")

f) Obrazek - image

Wyświetli wybrany przeze mnie obrazek, który znajduje się w tym samym folderze co plik z kodem.

st.write("### A to jest obrazek:")
st.image(image="Panna.png")

g) Przycisk - button

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

h) Wykres słupkowy - bar chart

chart_data = pd.DataFrame(np.random.randn(20, 3), columns=["a", "b", "c"])
st.bar_chart(chart_data)

i) Wykres słupkowy na podstawie csv

st.write("Wykres słupowy na podstawie danych wczytanych z csv")
news_df = pd.read_csv("news_decline.csv")
st.bar_chart(news_df, x="Show")

j) Wszystkie kody

import streamlit as st
import pandas as pd
import numpy as np

# Komponenty tekstowe - write, header, subheader
st.set_page_config(page_title="Zajęcia 12")
# st.title("Jakiś tytuł")
# st.header("A to nagłówek")
st.write("# to H1")
st.write("## to naglowek")

# Pole do wprowadzania danych - text_input
moj_wpis = st.text_input(label="To jest text input")

# Suwak - slider
age = st.slider("How old are you?", 0, 130, 25)
st.write("I'm ", age, "years old")

# Checkbox - checkbox
agree = st.checkbox(" I agree")
if agree:
    st.write("Great!")

# Multiselect
zwierzeta = ["pies", "kot", "chomik", "rybki"]
moj_multiselect = st.multiselect(label="Wybor zwierzat", options=zwierzeta,)

st.write(f"Wybrano: {moj_multiselect}")

# obrazek - image
st.write("### A to jest obrazek:")
st.image(image="Panna.png")

# Przycisk - button
moj_przycisk = st.button(label="Wciśnij mnie")

# Wykres słupkowy - bar chart
chart_data = pd.DataFrame(np.random.randn(20, 3), columns=["a", "b", "c"])

st.bar_chart(chart_data)

#Wykres słupkowy na podstawie csv
st.write("Wykres słupowy na podstawie danych wczytanych z csv")
news_df = pd.read_csv("news_decline.csv")
st.bar_chart(news_df, x="Show")

k) Przykład dodatkowy

import streamlit as st

# przywitaj
imie = st.text_input(label="Wprowadź imię")
przycisk = st.button("wciśnij mnie")

if przycisk:
    st.write(f"Witaj {imie}")

9) Orzeł czy reszka?

import streamlit as st
import random

strony_monety = ("orzel.jpg", "reszka.jpg")

st.write("# Orzeł czy reszka?")
przycisk = st.button("Rzuć monetą")

if przycisk:
    st.image(image=random.choice(strony_monety))

10) Zadanie grupowe - rzut kostką. Różne kostki.

Kostki: K4, K6, K8, K10, K12, K20.

import streamlit as st
import random

kostki = ["K4", "K6", "K8", "K10", "K12", "K20"]

lista = st.selectbox("Wybierz kostkę", kostki)

przycisk = st.button("Rzuć kostką")

if przycisk:
    if lista == "K4":
        wynik = random.randint(1, 4)
    elif lista == "K6":
        wynik = random.randint(1, 6)
    elif lista == "K8":
        wynik = random.randint(1, 8)
    elif lista == "K10":
        wynik = random.randint(1, 10)
    elif lista == "K12":
        wynik = random.randint(1, 12)
    else:
        wynik = random.randint(1, 20)

    st.write(f"Wynik: {wynik}")

Można zrobić inny przycisk jako st.radio()

rodzaj_kostki = st.radio(
"Wybierz rodzaj kostki:",
["k4", "k6", "k8", "k10", "k12", "k20"]
)

Rozwiązanie z zajęć ze słownikiem:

kostki = {
    "k4": 4,
    "k6": 6,
    "k8": 8,
    "k12": 12,
    "k20": 20,
}

wybor = st.selectbox(
    label="Wybierz rodzaj kości",
    options=kostki.keys(),
)

losuj_btn = st.button(label="Rzuć kostką")

if losuj_btn and wybor:
    wylosowana_wartosc = random.randint(1, kostki[wybor])
    st.write(f"Rzucając {wybor} wylosowano: {wylosowana_wartosc}")

11) Aplikacja, która liczy ilość słów w ciągu znaków/zdaniu

import streamlit as st

pole_tekstowe = st.text_area(label="Wprowadź swój tekst:")
przycisk_policz = st.button(label="Policz słowa")

if przycisk_policz:
    slowa = pole_tekstowe.split()
    st.write(f"W tym tekście jest {len(slowa)} słów.")

12) Program dodający liczby kolejne / Odliczający

import streamlit as st

wartosc_startowa = 1

przycisk_dodaj = st.button(label="Dodaj +1")

if przycisk_dodaj:
    wartosc_startowa += 1

st.write(wartosc_startowa)

13) Session State w Streamlit

Session State - Streamlit Docs
st.session_state is a way to share variables between reruns, for each user session.
with st.form("my_form"):
    st.write("Inside the form")
    slider_val = st.slider("Form slider")
    checkbox_val = st.checkbox("Form checkbox")
    
    # Every form must have a submit button.
    submitted = st.form_submit_button("Submit")
    if submitted:
        st.write("Slider", slider_val, "Checkbox", checkbox_val)

st.write("Outside the form")
import streamlit as st

# Slider_val = st.slider("suwak poza formularzem")
def zapisz_do_txt(imie):
    with open("imiona.txt", "a") as nazwa_pliku:
        nazwa_pliku.write(f"{imie}\n")

with st.form("my_form"):
    imie = st.text_input(label="Wprowadź imię")
    
    # Every form must have a submit button.
    submitted = st.form_submit_button("Prześlij")
    if submitted:
        st.write(f"Twoje imię to: {imie}")
        zapisz_do_txt(imie)

st.write("Outside the form")

14)

15)

16)