Guidad övning

Kap 5.6 – Skämtregister med GUI, API och databas

Bygg ett skämtregister som hämtar data från ett API och sparar det i SQLite.

Mål med lektionen

När du har arbetat klart med denna lektion ska du:

  • Kunna kombinera tkinter, requests och sqlite3 i ett mindre projekt.
  • Skapa ett fungerande flöde från användarens inmatning till databas och API.
  • Förbereda dig för det större projektet i Lärarbedömd uppgift 5.

Så här lär du dig bäst

Följ med i det enkla exemplet nedan och bygg sedan ut det steg för steg. Testa först att programmet fungerar med hårdkodad data och lägg sedan till möjligheter att ta in information från användaren. Jämför med det större projekt du ska göra senare och fundera på vad du kan återanvända eller förbättra.

Övning: Skapa ett skämtregister

Du ska skapa ett GUI-program där användaren kan hämta ett skämt från ett API och spara det i en lokal SQLite-databas.

Det här är en förberedande övning inför Inlämningsuppgift 5. Grundversionen av skämtregistret får inte lämnas in oförändrad. Välj en annan projektidé eller bygg ut programmet med tydligt egen funktionalitet, struktur och felhantering.

Funktioner

  • En knapp för att hämta ett skämt via API.
  • En etikett som visar skämtet.
  • En knapp för att spara skämtet i en lokal SQLite-databas.
  • En knapp för att visa alla sparade skämt.

Viktigt innan du börjar

Programmet använder requests. Om biblioteket inte redan är installerat behöver du köra:

pip3 install requests

Exempelkod - Grundstruktur

import tkinter as tk
import sqlite3
from contextlib import closing

import requests

DB_FIL = "skamt.db"
API_URL = "https://official-joke-api.appspot.com/random_joke"
senaste_skamt = None

def skapa_databas():
    try:
        with closing(sqlite3.connect(DB_FIL)) as conn:
            conn.execute("""
                CREATE TABLE IF NOT EXISTS skamt (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    setup TEXT NOT NULL,
                    punchline TEXT NOT NULL
                )
            """)
            conn.commit()
    except sqlite3.Error as error:
        skamt_label.config(text=f"Databasfel: {error}")

def hamta_skamt():
    global senaste_skamt

    try:
        response = requests.get(API_URL, timeout=10)
        response.raise_for_status()
        data = response.json()
        senaste_skamt = (data["setup"], data["punchline"])
        skamt_label.config(text=" - ".join(senaste_skamt))
    except (requests.RequestException, KeyError, ValueError):
        senaste_skamt = None
        skamt_label.config(text="Kunde inte hämta ett skämt.")

def spara_skamt():
    if senaste_skamt is None:
        skamt_label.config(text="Hämta ett skämt först.")
        return

    try:
        with closing(sqlite3.connect(DB_FIL)) as conn:
            conn.execute(
                "INSERT INTO skamt (setup, punchline) VALUES (?, ?)",
                senaste_skamt
            )
            conn.commit()
        skamt_label.config(text="Skämtet sparades!")
    except sqlite3.Error as error:
        skamt_label.config(text=f"Databasfel: {error}")

def visa_skamt():
    try:
        with closing(sqlite3.connect(DB_FIL)) as conn:
            rader = conn.execute("SELECT * FROM skamt").fetchall()
        output = "\n".join(f"{rad[1]} - {rad[2]}" for rad in rader)
        skamt_label.config(text=output or "Inga skämt är sparade.")
    except sqlite3.Error as error:
        skamt_label.config(text=f"Databasfel: {error}")

root = tk.Tk()
root.title("Skämtregister")

tk.Button(root, text="Hämta skämt", command=hamta_skamt).pack()
tk.Button(root, text="Spara skämt", command=spara_skamt).pack()
tk.Button(root, text="Visa alla skämt", command=visa_skamt).pack()

skamt_label = tk.Label(root, text="", wraplength=300, justify="left")
skamt_label.pack()

skapa_databas()
root.mainloop()

Hur flödet fungerar

  1. Programmet skapar databasen skamt.db och tabellen skamt om de inte redan finns.
  2. Användaren klickar på Hämta skämt.
  3. Programmet anropar API:et och sparar det senaste skämtet i variabeln senaste_skamt.
  4. Användaren klickar på Spara skämt för att lägga in skämtet i databasen.
  5. Användaren kan klicka på Visa alla skämt för att läsa ut sparade rader.

Interaktiv simulering: skämtregister i tkinter

Testa samma flöde som i koden. Det simulerade fönstret hämtar ett skämt, sparar det senaste skämtet i en simulerad SQLite-tabell och visar alla sparade skämt.

Skämtregister

Vad händer i koden?

Programmet har skapat skamt.db och väntar på knapptryck.

Programmering 2-koppling: simuleringen visar hur tkinter hanterar klick, requests hämtar data från API:et och sqlite3 sparar skämtet i databasen.

Att testa och bygga vidare

  • Testa att spara flera skämt.
  • Bygg ett sökfält för att söka bland sparade skämt.
  • Lägg till en funktion för att ta bort skämt.
  • Testa felhanteringen när API:et eller nätverket inte svarar.
  • Dela upp GUI, API-anrop och databasfunktioner i egna moduler.
  • Öppna skamt.db med SQLite Viewer i VS Code och kontrollera att raderna sparas.

Sammanfattning

  • Du har kombinerat tre viktiga tekniker i ett enda litet program.
  • Du har skapat ett grafiskt gränssnitt som kommunicerar med både API och databas.
  • Du har lagt grunden för den lärarbedömda uppgiften i Modul 5.

Tillbaka till Kapitel 5