Gå till innehållet

Grafik med turtle (Python)

Med turtle kan du rita med en penna som styrs av Python. Perfekt för att se resultat direkt!

Vad är Turtle?

Tänk dig en robotpenna på ett papper. Du kan säga till den att gå framåt, svänga höger eller vänster, byta färg och rita former. Det är enkelt och kul!

Så här använder du turtle i ett Python-program.

Kom igång (din första linje)

Python
import turtle as t

# skapa fönster och sköldpadda
skärm = t.Screen()
penna = t.Turtle()

# rita en linje 120 pixlar
penna.forward(120)

skärm.mainloop()  # håll fönstret öppet

Förklaring: - t.Screen() skapar ett fönster (som ett papper). - t.Turtle() skapar pennan (sköldpaddan) som ritar. - forward(120) går framåt 120 steg (pixlar) och ritar en linje.

Öva: - Ändra talet till 50, 200, 300. Vad händer? - Lägg till penna.right(90) efter forward. Ritar den i en ny riktning?

Steg 2: Svänga och vinklar

Python
1
2
3
4
5
penna.forward(100)   # framåt 100
penna.right(90)      # sväng 90° åt höger
penna.forward(100)
penna.left(45)       # sväng 45° åt vänster
penna.forward(70)

Tips: Höger är medurs (↻), vänster är moturs (↺).

Steg 3: Fyrkant med loop

Istället för att upprepa fyra rader kan vi loopa:

Python
1
2
3
for _ in range(4):
    penna.forward(100)
    penna.right(90)

Micro-övningar: - Byt 100 till 60. Hur stor blir kvadraten? - Byt right(90) mot left(90). Vad ändras?

Steg 4: Egen funktion – rita kvadrat

Python
1
2
3
4
5
6
7
8
def rita_kvadrat(sida):
    for _ in range(4):
        penna.forward(sida)
        penna.right(90)

rita_kvadrat(80)
penna.penup(); penna.forward(120); penna.pendown()
rita_kvadrat(120)

Varför funktion? Du kan rita flera kvadrater med olika storlek utan att kopiera kod.

Steg 5: Färg, tjocklek och fyllning

Python
1
2
3
4
5
6
7
8
penna.color("blue")      # linjefärg
penna.pensize(3)         # pennans tjocklek
penna.circle(50)         # rita en cirkel (radie 50)

penna.color("red", "yellow")  # (linjefärg, fyllnadsfärg)
penna.begin_fill()
rita_kvadrat(100)
penna.end_fill()

Prova andra färger: "green", "purple", "orange". Du kan också använda RGB: penna.color(0.2, 0.6, 0.9) (värden 0..1).

Steg 6: Hoppa utan att rita (penna upp/ner)

Python
1
2
3
4
5
penna.penup()            # lyft pennan
penna.goto(-150, 100)    # hoppa till koordinat (x, y)
penna.setheading(0)      # sikta åt höger (0°)
penna.pendown()          # sätt ner pennan – rita igen
rita_kvadrat(60)

Förklaring: - Koordinater: x ökar åt höger, y ökar uppåt. (0,0) är mitten. - setheading(0/90/180/270) sätter riktning (höger/upp/vänster/ner).

Steg 7: Rutnät med loop i loop

Python
def rita_ruta(sida):
    penna.begin_fill(); rita_kvadrat(sida); penna.end_fill()

penna.color("black", "lightblue")
penna.speed(0)

start_x, start_y = -150, 150
penna.penup(); penna.goto(start_x, start_y); penna.pendown()

sida = 30
for rad in range(5):
    for kol in range(5):
        rita_ruta(sida)
        penna.penup(); penna.forward(sida + 5); penna.pendown()
    penna.penup(); penna.goto(start_x, start_y - (rad+1)*(sida+5)); penna.pendown()

Utmaning: Färga olika rutor i olika färger (t.ex. varannan rad).

Steg 8: Slumpfärger (mer levande konst)

Python
import random

def slumpfärg():
    return (random.random(), random.random(), random.random())  # RGB 0..1

penna.speed(0)
for _ in range(36):
    penna.color(slumpfärg())
    penna.circle(80)
    penna.right(10)

Mini-projekt 1: Rita ett hus (steg för steg)

1) Väggar: en kvadrat 120. 2) Tak: en triangel ovanpå. 3) Dörr och fönster: mindre rektanglar.

Python
def rita_triangel(sida):
    for _ in range(3):
        penna.forward(sida)
        penna.left(120)

penna.color("black", "#ffe4b5"); penna.begin_fill()
rita_kvadrat(120)
penna.end_fill()

penna.left(90); penna.forward(120); penna.right(90)
penna.color("black", "#ff9999"); penna.begin_fill()
rita_triangel(120)
penna.end_fill()

# dörr
penna.color("black", "sienna"); penna.penup(); penna.goto(30, 0); penna.setheading(90); penna.pendown()
for _ in range(2):
    penna.forward(60); penna.right(90); penna.forward(30); penna.right(90)

Utmaningar: - Lägg till ett fönster (kvadrat) med annan färg. - Rita flera hus på rad med penna.goto(...).

Mini-projekt 2: Stjärna

Python
1
2
3
4
penna.color("gold")
for _ in range(5):
    penna.forward(150)
    penna.right(144)  # magiska vinkeln för 5-spetsig stjärna

Bonus: Fyll stjärnan (prova begin_fill/end_fill).

For över listor (färgbyte i en följd)

Python
1
2
3
4
5
färger = ["red", "orange", "yellow", "green", "blue", "purple"]
for f in färger:
    penna.color(f)
    penna.forward(60)
    penna.right(60)

Vanliga problem och felsökning

  • Fönstret stänger direkt: säkerställ att du har skärm.mainloop() sist.
  • Ingenting ritas: kontrollera att pennan är nere (pendown) och att du ritar efter att du skapat Turtle().
  • Allt går långsamt: använd penna.speed(0) för snabbaste ritning.
  • Oväntad riktning: lägg in penna.setheading(0) för att börja åt höger.
  • Linjer mellan figurer: använd penna.penup() när du flyttar utan att rita.

Idéer att bygga vidare på

  • Mönster med polygoner: skriv en funktion rita_polygon(n, sida) och experimentera med n.
  • Fireworks: rita många korta linjer med slumpmässig färg och riktning.
  • Blommor: många små cirklar runt en punkt med olika färger.

Snabba övningar (från lätt till svårare)

1) Rita tre kvadrater i olika storlek och färg bredvid varandra. 2) Rita en rektangel: bredd 160, höjd 80. 3) Rita ett rutnät 6×4 med små fyllda rutor (valfri färg per rad). 4) Rita en “spirograf”: 36 cirklar med radie 80, rotera 10° mellan varje. 5) Rita en vimpelrad: triangel – mellanrum – triangel – mellanrum … i olika färger.

Hitta felen! (5 fel)

Rätta detta Turtle-exempel:

Python
1
2
3
4
5
6
7
8
9
import turtle as t
penna = t.Turtle()
penna.color("blu")
penna.penup()
penna.forward(100)
penna.right(90)
for _ in range(4):
    penna.forward(50)
    penna.right(90)

Facit

Python
# Fix 1: Skapa ett fönster (Screen) och behåll det öppet med mainloop
import turtle as t
skärm = t.Screen()

penna = t.Turtle()

# Fix 2: Korrekt färgnamn
penna.color("blue")

# Fix 3: Sätt ner pennan innan du ritar
penna.pendown()

# Fix 4: Rita från startpositionen eller gå tillbaka efter flytt med penna upp/ner
penna.penup(); penna.goto(0, 0); penna.pendown()

# Fix 5: Rita en kvadrat tydligt
for _ in range(4):
    penna.forward(50)
    penna.right(90)

skärm.mainloop()