Maven_super_30_LeseTolkeKode_2 - itnett/FTD02H-N GitHub Wiki

Her er et samlet skript som inkluderer eksempler på mange av de konseptene vi har diskutert tidligere. Dette skriptet kombinerer grunnleggende programmeringsteknikker, objektorientert programmering, GUI-utvikling, API-kommunikasjon, filbehandling, datasikkerhet, og mer. Jeg har inkludert detaljert kommentering for hver linje og hver funksjon for å hjelpe deg med å forstå koden.

Samlet Python Skript med Detaljerte Kommentarer

# Importerer nødvendige biblioteker for å bygge programmet
import tkinter as tk  # GUI-biblioteket Tkinter
import requests  # For API-kall
import json  # For håndtering av JSON-data
import os  # For filbehandling
import hashlib  # For datasikkerhet, her brukt til hashing
from tkinter import messagebox  # For meldingsbokser i GUI

# Definerer en klasse for vårt NotatVerktøy, som inkluderer GUI, API-henting, filbehandling og datasikkerhet
class NotatVerktøy:
    def __init__(self, root):
        """Konstruktørmetoden for å initialisere GUI-komponenter og variabler"""
        # Binder rotvinduet (hovedvinduet) til instansvariabelen
        self.root = root  # Hovedvinduet for applikasjonen
        self.root.title("Notatverktøy")  # Setter tittelen på hovedvinduet

        # Variabeldeklarasjoner
        self.filnavn = "notater.txt"  # Filnavnet hvor notater lagres
        self.nåværende_notat = ""  # Holder innholdet av det nåværende notatet

        # GUI-komponenter
        self.text_area = tk.Text(self.root, wrap='word')  # Tekstområde for å skrive notater
        self.text_area.pack(expand=True, fill='both')  # Plasserer tekstområdet i hovedvinduet

        # Menylinje - en del av GUI som inneholder kommandoer som "Lagre", "Åpne", osv.
        self.menylinje = tk.Menu(self.root)  # Lager en menylinje
        self.root.config(menu=self.menylinje)  # Konfigurerer menylinjen i hovedvinduet

        # Filer-menyen
        fil_meny = tk.Menu(self.menylinje, tearoff=0)  # Lager en undermeny for filer
        self.menylinje.add_cascade(label="Filer", menu=fil_meny)  # Legger til "Filer" i menylinjen
        fil_meny.add_command(label="Lagre", command=self.lagre_notat)  # Legger til "Lagre"-kommando i menyen
        fil_meny.add_command(label="Åpne", command=self.åpne_notat)  # Legger til "Åpne"-kommando i menyen

        # Hjelp-menyen
        hjelp_meny = tk.Menu(self.menylinje, tearoff=0)  # Lager en undermeny for hjelp
        self.menylinje.add_cascade(label="Hjelp", menu=hjelp_meny)  # Legger til "Hjelp" i menylinjen
        hjelp_meny.add_command(label="Om", command=self.om)  # Legger til "Om"-kommando i menyen

        # Laster inn tidligere notater om filen eksisterer
        self.åpne_notat()

    def lagre_notat(self):
        """Lagrer det nåværende notatet til en fil"""
        try:
            # Åpner filen for skriving ('w' for skrive modus)
            with open(self.filnavn, 'w') as fil:
                filinnhold = self.text_area.get(1.0, tk.END)  # Henter innholdet fra tekstområdet i GUI
                fil.write(filinnhold)  # Skriver innholdet til filen
            # Viser en informasjonboks som bekrefter lagring
            messagebox.showinfo("Lagre", "Notat lagret!")
        except IOError as e:  # Fanger opp fil I/O-feil
            messagebox.showerror("Feil", f"Kunne ikke lagre notatet: {e}")

    def åpne_notat(self):
        """Åpner et notat fra fil hvis det eksisterer"""
        if os.path.exists(self.filnavn):  # Sjekker om filen eksisterer
            try:
                # Åpner filen for lesing ('r' for lesemodus)
                with open(self.filnavn, 'r') as fil:
                    innhold = fil.read()  # Leser innholdet av filen
                    self.text_area.delete(1.0, tk.END)  # Tømmer tekstområdet i GUI
                    self.text_area.insert(tk.END, innhold)  # Setter inn filinnholdet i tekstområdet
            except IOError as e:  # Fanger opp fil I/O-feil
                messagebox.showerror("Feil", f"Kunne ikke åpne notatet: {e}")

    def om(self):
        """Viser en informasjonstekst om applikasjonen"""
        messagebox.showinfo("Om", "Notatverktøy v1.0 - Et enkelt notatverktøy")

    def krypter_innhold(self, innhold):
        """Krypterer innholdet ved hjelp av en hashfunksjon"""
        hasher = hashlib.sha256()  # Initialiserer SHA-256 hashing-algoritmen
        hasher.update(innhold.encode('utf-8'))  # Oppdaterer hashen med innholdet, konvertert til bytes
        return hasher.hexdigest()  # Returnerer den heksadesimale representasjonen av hashen

    def hent_data_fra_api(self):
        """Eksempel på å hente data fra et API (f.eks. OpenWeatherMap)"""
        api_url = "https://api.openweathermap.org/data/2.5/weather?q=Oslo&appid=ditt_api_nøkkel"
        try:
            respons = requests.get(api_url)  # Sender en GET-forespørsel til API-en
            data = respons.json()  # Konverterer svaret til JSON
            temperatur = data['main']['temp']  # Henter temperaturen fra dataen
            # Konverterer temperaturen fra Kelvin til Celsius
            return f"Temperaturen i Oslo er {temperatur - 273.15:.2f}°C"
        except requests.RequestException as e:  # Fanger opp nettverksfeil
            messagebox.showerror("Feil", f"Kunne ikke hente data fra API: {e}")
            return "Ingen data tilgjengelig"

# Starten på programmet, som lager rotvinduet og starter applikasjonen
if __name__ == "__main__":
    root = tk.Tk()  # Oppretter hovedvinduet
    app = NotatVerktøy(root)  # Instansierer klassen NotatVerktøy
    root.mainloop()  # Starter hovedløkken for GUI-en

Forklaring og Kommentarer

Dette skriptet demonstrerer flere viktige konsepter i Python-programmering:

  1. Programstrukturer:

    • Klasser og metoder: Koden er strukturert rundt en klasse (NotatVerktøy), som organiserer GUI-komponenter og andre funksjoner.
  2. Datastrukturer:

    • JSON: Data fra API-et behandles som en dictionary, som er en av de mest brukte datastrukturene i Python.
  3. Bibliotek:

    • Flere biblioteker som tkinter, requests, os, og hashlib brukes for GUI, nettverkskommunikasjon, filbehandling, og sikkerhet.
  4. Funksjoner og metoder:

    • Funksjoner som lagre_notat, åpne_notat, krypter_innhold, og hent_data_fra_api viser hvordan du modulariserer kode i metoder som utfører spesifikke oppgaver.
  5. Objektorientert programmering:

    • NotatVerktøy-klassen demonstrerer objektorientert design, der ulike elementer og logikk er pakket inn i en klasse for bedre organisasjon.
  6. Debugging, testing og unntaksbehandling:

    • try-except blokker er implementert for å håndtere potensielle feil som kan oppstå under filoperasjoner eller API-kall, og for å vise passende feilmeldinger til brukeren.
  7. API:

    • hent_data_fra_api-metoden demonstrerer hvordan du kan hente data fra en ekstern API og behandle resultatene.
  8. GUI:

    • Tkinter brukes til å lage et enkelt, men funksjonelt brukergrensesnitt hvor brukeren kan skrive og lagre notater.
  9. Filbehandling:

    • Metoder for å lagre og åpne notater fra en fil (lagre_notat og åpne_notat) viser hvordan du kan arbeide med filer i Python.
  10. Datasikkerhet:

    • `krypter_in

nhold`-metoden bruker SHA-256 hashing for å demonstrere grunnleggende datasikkerhet.

  1. Grunnleggende programmeringsteknikker:

    • Hele skriptet bruker grunnleggende teknikker som variabeldeklarasjoner, kontrollstrukturer (if, try-except), løkker, og funksjoner/metoder.
  2. Utvikling av brukergrensesnitt:

    • Tkinter brukes til å utvikle et GUI hvor brukeren kan samhandle med programmet.

Dette skriptet kan kjøres som en Python-applikasjon. Det vil vise et grafisk brukergrensesnitt der du kan skrive, lagre, og åpne notater. Samtidig er det et pedagogisk verktøy for å lære hvordan forskjellige programmeringsteknikker fungerer i praksis. Hvis du ønsker å utvide dette programmet med flere funksjoner eller mer avansert logikk, kan du bruke den nåværende koden som en solid grunnmur.