Python - zajęcia 12
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.

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
- 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
.
- Krok pierwszy - instaluj:
pip install streamlit
- Wykorzystaj bibliotekę w programie pythonowym:
import streamlit as st
st.write("Hello World!")
- 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



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)