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,requestsochsqlite3i 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
- Programmet skapar databasen
skamt.dboch tabellenskamtom de inte redan finns. - Användaren klickar på Hämta skämt.
- Programmet anropar API:et och sparar det senaste skämtet i variabeln
senaste_skamt. - Användaren klickar på Spara skämt för att lägga in skämtet i databasen.
- 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.dbmed 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.