Programmering nivå 2

Kap 5.6 – Miniuppgift: Kombinera 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.

Miniuppgift: 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.

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 requests
import sqlite3

# Skapa databas
conn = sqlite3.connect("skamt.db")
cursor = conn.cursor()
cursor.execute("""
    CREATE TABLE IF NOT EXISTS skamt (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        setup TEXT,
        punchline TEXT
    )
""")
conn.commit()

senaste_skamt = None

# Funktioner
def hamta_skamt():
    global senaste_skamt
    response = requests.get("https://official-joke-api.appspot.com/random_joke")

    if response.status_code == 200:
        data = response.json()
        skamt_label.config(text=f"{data['setup']} - {data['punchline']}")
        senaste_skamt = (data["setup"], data["punchline"])

def spara_skamt():
    if senaste_skamt:
        cursor.execute(
            "INSERT INTO skamt (setup, punchline) VALUES (?, ?)",
            senaste_skamt
        )
        conn.commit()
        skamt_label.config(text="Skämtet sparat!")

def visa_skamt():
    cursor.execute("SELECT * FROM skamt")
    rader = cursor.fetchall()
    output = "\n".join([f"{r[1]} - {r[2]}" for r in rader])
    skamt_label.config(text=output[:300] + "..." if len(output) > 300 else output)

# GUI
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()

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.

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.
  • Lägg till bättre felhantering om API:et inte svarar.
  • Ö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