🐍Python🐍 - zajęcia 9

🐍Python🐍 - zajęcia 9
Photo by David Clode / Unsplash
  • 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:

  1. Intuicyjny i łatwy w obsłudze dla początkujących użytkowników.
  2. Wizualne elementy (przyciski, ikony) ułatwiają nawigację i szybkie wykonanie zadań.
  3. Możliwość jednoczesnej pracy z wieloma oknami i narzędziami.

Wady:

  1. Zużywa więcej zasobów systemowych (pamięć, procesor).
  2. Mniej precyzyjny i wolniejszy przy wykonywaniu powtarzalnych zadań lub automatyzacji.
  3. Czasem ograniczona możliwość zaawansowanej konfiguracji i skryptowania.

CLI (Wiersz Poleceń, Command Line Interface)

Zalety:

  1. Szybkie i precyzyjne wykonywanie zadań, zwłaszcza za pomocą skryptów i automatyzacji.
  2. Zużywa bardzo mało zasobów systemowych.
  3. Daje dostęp do zaawansowanych funkcji i opcji, często niedostępnych w GUI.

Wady:

  1. Wymaga znajomości składni i komend, co może być trudne dla początkujących.
  2. Brak wizualnych wskazówek utrudnia nawigację i orientację.
  3. 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łady Row i Column, 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

  1. importowanie bibliotek
  2. definiowanie cech okna głównego (def main(page: flet.Page):)
    1. tworzenie funkcji własnych
    2. sekcja deklarowania komponentów okna (ikony, tekst, pola do wprowadzania tekstu, przyciski, obrazki)
    3. sekcja umieszczania zadeklarowanych komponentów (page.add())
  3. 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)