🐍Python🐍 - zajęcia 9
- funkcje własne
- GUI vs CLI
- biblioteka flet, qrcode, BytesIO, base64
- program do generowania kodów qr
- Program do wprowadzania pytań
Funkcje własne
- struktura
def nasza_funkcja(parametr np. 1)
zwracana_wartosc = parametr + 8
return zwracana_wartosc
- return - nie zawsze będzie się pojawiać na końcu, ale w większości przypadków
⚠️Czy funkcja zawsze coś zwraca?
Nie! przykład - print()
⚠️ Dobra praktyka
dodawać do deklarowanych funkcji i ich parametrów spodziewany typ danych (np. int lub float)

przykład funkcji własnej - obliczenie silni:
#silnia
def silnia(liczba: int ) -> int:
wynik = 1
# if liczba < 0:
# print("tylko liczby naturalne")
# elif liczba <2:
# return wynik
for i in range(2, liczba+1):
wynik *= i
return wynik
print(silnia(3))
- jeśli spodziewamy się więcej niż 1 typ danych wykorzystujemy " | " do oddzielenia typu danych
def dodaj_2_liczby(x: int | float, y:int | float,) -> int | float:
return x + y
print(dodaj_2_liczby(2, 3))
GUI vs CLI
GUI (Graficzny Interfejs Użytkownika)
Zalety:
- Intuicyjny i łatwy w obsłudze dla początkujących użytkowników.
- Wizualne elementy (przyciski, ikony) ułatwiają nawigację i szybkie wykonanie zadań.
- Możliwość jednoczesnej pracy z wieloma oknami i narzędziami.
Wady:
- Zużywa więcej zasobów systemowych (pamięć, procesor).
- Mniej precyzyjny i wolniejszy przy wykonywaniu powtarzalnych zadań lub automatyzacji.
- Czasem ograniczona możliwość zaawansowanej konfiguracji i skryptowania.
CLI (Wiersz Poleceń, Command Line Interface)
Zalety:
- Szybkie i precyzyjne wykonywanie zadań, zwłaszcza za pomocą skryptów i automatyzacji.
- Zużywa bardzo mało zasobów systemowych.
- Daje dostęp do zaawansowanych funkcji i opcji, często niedostępnych w GUI.
Wady:
- Wymaga znajomości składni i komend, co może być trudne dla początkujących.
- Brak wizualnych wskazówek utrudnia nawigację i orientację.
- Błędy w pisowni komend mogą prowadzić do nieoczekiwanych skutków lub frustracji.
Biblioteka flet
- to biblioteka Pythona do tworzenia nowoczesnych interfejsów użytkownika (UI) w sposób prosty i deklaratywny, bazująca na modelu reaktywnym.
- Najciekawsze funkcje Flet to m.in. komponenty takie jak
TextField
,Button
,Image
, a także układyRow
iColumn
, które pozwalają łatwo tworzyć responsywne i estetyczne interfejsy. - instalacja (w terminalu): pip install flet(all)
- uruchamianie programu: przez przycisk RUN lub przez terminal (wpisujemy: flet run nazwa_aplikacji)
- link do materiałów o bibliotece:
Icon | Flet
Displays a Material icon.

Budowa kodu
- importowanie bibliotek
- definiowanie cech okna głównego (def main(page: flet.Page):)
- tworzenie funkcji własnych
- sekcja deklarowania komponentów okna (ikony, tekst, pola do wprowadzania tekstu, przyciski, obrazki)
- sekcja umieszczania zadeklarowanych komponentów (page.add())
- zakończenie (flet.app(main)
Biblioteka qrcode
- służy do generowania kodów QR w Pythonie
- Umożliwia łatwe tworzenie obrazów QR na podstawie tekstu lub dowolnych danych. Wynikiem działania jest obraz, który można zapisać do pliku lub przetworzyć dalej (np. w pamięci).
- qrcode jest prosta w użyciu i dobrze integruje się z innymi bibliotekami graficznymi, co pozwala na szybkie tworzenie wizualnych reprezentacji danych.
Biblioteka base64
- pozwala na kodowanie i dekodowanie danych binarnych w formacie tekstowym (Base64).
- Jest to często wykorzystywane do przesyłania obrazów lub plików w formie tekstowej, np. w JSON czy HTML.
- W aplikacjach GUI, takich jak Flet, base64 pozwala na osadzanie obrazów (np. wygenerowanych kodów QR) bezpośrednio w komponentach graficznych poprzez kodowanie obrazów do ciągu znaków. Base64 jest standardowym narzędziem do konwersji między formatami binarnymi i tekstowymi, powszechnie wykorzystywanym w programowaniu sieciowym i webowym.
Mój program do generowania QR kodów
Biblioteka: flet, qrcode, base64
Jak działa program?
- na górze programu są kolorowe napisy (zmienna tekst_przywitania i tekst_przywitania2).

- poniżej jest ikona pytajnika, która ma funkcję Tooltip (po najechaniu kursorem wyświetla tekst). W tej samej linii (użycie w sekcji umieszczania zadeklarowanych komponentów funkcji "flet.Row()" ) znajduje się pole do wpisania tekstu do kodu qr (pole_na_odpowiedz) i przycisk generujący z obrazek z tego tekstu (przycisk).

- w czwartej linii znajduje się napis "Kod QR" (tekst_3)
- w piątym wierszu generowany jest obrazek - kod QR i pojawia się pytanie (tekst_4) o zadowolenie z programu. Odpowiedzi można udzielić przez skorzystanie z 2 przycisków (przycisk2 i przycisk3) zawierających ikony.
- Wybranie jednej z opcji powoduje wyświetlenie odpowiedniego tekstu (odpowiedz1 i odpowiedz2)

Kod programu:
import flet
import qrcode
from io import BytesIO
import base64
##### główne okno
def main(page: flet.Page):
page.title = "Generator kodów QR" # tytuł okna
page.theme_mode = flet.ThemeMode.LIGHT # schemat jasny
page.bgcolor = flet.Colors.GREY_100
def utworz_qr_image(pole_na_odpowiedz: str) -> str:
img = qrcode.make(pole_na_odpowiedz)
buffer = BytesIO()
img.save(buffer, format="PNG")
qr_img_b64 = base64.b64encode(buffer.getvalue()).decode()
return qr_img_b64
#Grupuję widgety, żeby maksymalnie uprościć kod
def ustaw_widocznosc(widgets, widoczne: bool):
for w in widgets:
w.visible = widoczne
w.update()
def tekst_do_qr_kodu(zdarzenie):
zdanie=pole_na_odpowiedz.value
qr_widgets = [tekst_4, przycisk2, przycisk3]
if zdanie:
obrazek.src_base64 = utworz_qr_image(zdanie)
obrazek.update()
ustaw_widocznosc(qr_widgets, True)
else:
ustaw_widocznosc(qr_widgets, False)
print("Nie wprowadzonno tekstu do qr kodu")
def on_click1(e):
odpowiedz1.value = f"No ja myślę!! :)"
odpowiedz1.update()
odpowiedz2.value = ""
odpowiedz2.update()
def on_click2(e):
odpowiedz2.value = f"Ekstra !!"
odpowiedz2.update()
odpowiedz1.value = ""
odpowiedz1.update()
##### sekcja komponentów
## Tekst na polu tekstowym zanim zostanie coś do niego wpisanego:
tekst_przywitania = flet.Text(
value="W tym programie wygenerujesz kod QR.",
size=30,
bgcolor=flet.Colors.GREEN_700
)
tekst_przywitania2 = flet.Text(
value="Najedź kursorem na pytajnik.",
size=20,
color=flet.Colors.GREEN_700
)
## ikona
ikona = flet.Icon(
name="question_mark_sharp",
size=30,
color=flet.Colors.INDIGO_500,
tooltip="Wystarczy,że wpiszesz tekst do pola tekstowego, a następnie wciśniesz przycisk."
)
## Pole odpowiedzi użytkownika
pole_na_odpowiedz = flet.TextField(
label="Wpisz tekst do kodu QR:"
)
## Obrazek kodu
obrazek = flet.Image(src_base64="")
## Przycisk do generowania qr
przycisk = flet.FilledButton(
text= "wygeneruj kod QR",
icon=flet.Icons.PARK_ROUNDED,
icon_color=flet.Colors.INDIGO_700,
on_click=tekst_do_qr_kodu
)
tekst_3 = flet.Text(
value="Kod QR: ",
size=30,
color=flet.Colors.INDIGO_700
)
## Ankieta zadowolenia
tekst_4 = flet.Text(
value="Jak Ci się podoba?",
size=15,
color=flet.Colors.PINK_500,
visible=False
)
przycisk2 = flet.ElevatedButton(
text="Bardzo mi się podoba",
on_click=on_click1,
icon=flet.Icons.FLIGHT,
icon_color=flet.Colors.INDIGO_700,
visible=False)
przycisk3 = flet.ElevatedButton(
text="Tak",
on_click=on_click2,
icon=flet.Icons.HOW_TO_REG,
icon_color=flet.Colors.INDIGO_700,
visible=False)
odpowiedz1 = flet.Text(" ")
odpowiedz2 = flet.Text(" ")
##### sekcja umieszczenia zadeklarowanych komponentów
page.add(
tekst_przywitania,
tekst_przywitania2,
#Jak umieścić różne elementy w jednym wierszu?
flet.Row(
controls=[ikona,pole_na_odpowiedz, przycisk]),
tekst_3,
flet.Row(
controls=[obrazek,tekst_4, przycisk2,przycisk3]
),
flet.Row(
controls=[odpowiedz1,odpowiedz2])
)
#### zakończenie
flet.app(main)
Program do wprowadzania pytań:

import flet
##### główne okno
def main(page: flet.Page):
page.title = "Tytuł" # tytuł okna
page.theme_mode = flet.ThemeMode.LIGHT # schemat jasny
page.bgcolor = flet.Colors.GREY_100
def zapisywanie_ankiety(pytanie: str, odpowiedz: str) -> str:
return pytanie
##### sekcja komponentów
tekst_pytanie = flet.Text(
value="Wprowadź tutaj pytanie i odp do kwestionariusza.",
size=30,
bgcolor=flet.Colors.GREEN_700
)
wpr_pyt = flet.TextField(
label="Wprowadź pytanie:",
text_size=30,
)
wpr_odp1 = flet.TextField(
label = "Wprowadz pierwszą odp")
wpr_odp2 = flet.TextField(
label = "Wprowadz drugą odp")
wpr_odp3 = flet.TextField(
label = "Wprowadz trzecią odp")
##### sekcja umieszczenia zadeklarowanych komponentów
page.add(
tekst_pytanie,
wpr_pyt,
wpr_odp1,
wpr_odp2,
wpr_odp3
)
#### zakończenie
flet.app(main)