Turtle Grafik i Python

Page 1

Turtle Grafik i Python Formål: Formålet med følgende øvelser er, at introducere skriftlig syntaks og kommandoer gennem en visuel tilgang ved brug af Turtle Grafik. Øvelserne er ikke et introduktionsforløb til Python, men rettet mod brugere, som har et basalt kendskab til Python og som kender en editor og til eksekvering af py-filer. Efter en indføring i turtle modulet, starter vi med de allermest basale kommandoer, som introducerer rotation og koordinater i canvaset. Jeg anbefaler at man læser afsnittet dir og help – god praksis. Jeg har valgt at inddrage det som et mindre crach course, fordi jeg synes det er en hamrende god – om end lidt overset - praksis til at søge hjælp i Python. Jeg anbefaler klart, at man selv skriver kommandoerne fra afsnittene i en Python editor. Jeg har skrevet alle kommandoer med freeMono. Eksemplerne blev lavet i Pythons version 3.7.3. Artiklen er skrevet af Atle Winther | atlewinther@protonmail.com Licensen er Attribution 4.0 International (CC BY 4.0)

Setup I Python følger turtle modulet automatisk med. Inde i vores editor importerer vi blot turtle-modulet. Indtast: Import turtle

Vi kan nu tegne turtle grafik.


Dir og help – god praksis Det er vigtigt, at få trænet en masse af det grundlæggende inden man går over til mere omfattende kommandoer. Jeg håber at man som minimum øver sig 20 gange på den samme kommando og gerne siger denne højt, mens man skriver den. Allerførst ser vi på hvor mange funktioner turtle modulet indeholder. Det viser dir(turtle) os. Dir står for directory og viser altså det directory som vi ønsker at dykke ned i. Her er det modulet turtles directory.

Der er mange funktioner der kan hjælpe med grafikken. Funktionerne er skrevet af andre programmører og har som formål at hjælpe os i Python. Vi skal snart bruge Pen og de funktioner, som der følger med der. Du kan læse om hver enkel funktion ved Pythons help-funktion. Gå på opdagelse i funktionen Pen ved at skrive help(turtle.Pen). Vi kan se at pen faktisk indeholder rigtig mange funktioner til at hjælpe os. Og gennemse gerne mere af turtles directory ved at benytte help(turtle.<funktion>) for oplysninger. Skriv fx help(turtle.goto). Jo flere funktioner du kender, des større bliver dit ”ordforråd” i turtle grafik også. Anskaf dig gerne en notesblok og beskriv de forskellige funktioners karakteristika. Husk at du kan bruge help() alle vegne. Det er ikke kun i turtle modulet. Du kan også bruge help-funktionen til Pythons standard funktioner ved at skrive help(__builtins__) og i alle andre moduler. At bruge dir og help er altid god praksis, som kommer en til gode, hvis man stødder på problemer med sin programmering undervejs. Når vi er blevet bekendte med dir og help går vi videre til næste skridt. Husk at bruge dem, når du er i tvivl om funktioner. Øvelser: Hvad gør dir()? Hvad gør circle? help(turtle.circle) Hvad gør forward? help(turtle.forward) hvad gør heading? help(turtle.heading) Hvad gør penup? help(turtle.penup) Hvad gør left? help(turtle.left) Find 5 andre funktioner ved brug af help-funktionen og skriv dem ned i en notesbog.


Tegn med Python Vi giver nu bogstavet t(t som i turtle), turtle modulets Pens egenskaber. Nu indeholder t alle Pen’s funktioner. Tænk på vores t som nu indeholder Pen’s egenskaber som et samlet set af instruktioner, der rent faktisk ville udgøre en fysisk kuglepen. Ved hjælp af Pen kan man tage kuglepennen op, ned, skifte blæk, tegne former, ændre vinkler mm. I vores tilfælde har vi fortalt Python, at t skal indeholde Pen’s funktioner og agerer kuglepen for os.

Samtidig dukker der et hvidt canvas op med en pil, som peger mod højre.


Når vi navigerer rundt i vores canvas, er der to ting, som vi skal kende til. Retningen på pilen og koordinaterne. Jeg sammenligner det med at bruge et kompas på et kort.

Turtle/Pilen: Pilen roterer frit i mellem 360 grader på vores canvas. Som standard er retningen sat til at se mod Øst, hvilket får den til at ”se”mod højre(Øst) på canvas’et. Det så vi da vi tastede t = turtle.Pen().


Rotation Hvis vi roterer pilen 90 grader til venstre, vil den se op mod Nord. Indtast t.left(90)

Pilen peger mod Nord.


Vi prøver at se, hvordan vi kan gü fra nordlig retning til syd. Indtast t.right(180)

Pilen har nu roteret mod Syd(180 grader rotation)


Hvis vi indtaster t.right(90) kan vi se vores turtle bevĂŚge sig mod Vest.


Koordinaterne

Det canvas som udgør vores udfoldelsesmuligheder er det kartesiske koordinatsystem, som er delt op i en positive og negative X og Y akser. Vores turtle starter inde fra midten af koordinatsystemet , hvor akserne X(0) og Y(0) skærer hinanden. Herfra kan man gå horisontalt langs X’ positive retning, eller baglæns i negativ. Vi kan også gå vertikalt op ad Y’s positive retning og ned lands den negative retning. Vores turtle ved vi kan bevæge sig i 360 grader, og vi ved nu også, hvordan det canvas det navigerer i ser ud. Lad os prøve nogle eksempler af. Vi slap vores pil, da den så mod Vest. Hvis vi ikke gider skriver left eller right 180, så kan vi i stedet bruge reset-funktionen. Indtast: t.reset()


Vi har benyttet reset-funktionen og er tilbage til udgangspunktet, hvor pilen peger mod øst.

help(t) Som stidligere nævnt indeholder t de samme egenskaber som modulet Pen. Vi kan for en god ordens skyld, finde hjælp til Pens egenskaber ved at skrive help(t). Vi ser bl.a. at den indeholder funktionen forward.

Kort og godt flytter forward altså vores turtle fremad. Man kan også se at den har et alias, fd, at argumenterne både er integers og floats. Og vi kan se eksempler på forward. Prøv fx at indtaste t.forward(100), som tegner en lige streg på 100 pixels hen ad X-aksens.


Og ved at skrive t.forward(50.78) ser vi at det passer, at vi også kan bruge floating til at bevæge vores turtle. Vores turtle ser nu mod Øst. Dvs at den ligger på (0, 0) og peger i X’ positive retning. Lad os se om det passer. Vi indtaster t.forward(200) og bevæger os nu 200 pixels fremad i X positive retning.

Vores turtle har bevæget sig 200 pixels i X’ positive retning på koordinatsystemet.

Vi beholder stregen. I stedet for at bruge reset-funktionen, benytter vi nu home-funktionen. Homefunktionen fører os hjem til X og Y’s skæringspunkt. Indtast t.home()


Lad os følge logikken bag koordinatsystemet. I stedet for at skrive forward(200) skriver vi 200 med negativt fortegn: -200. Indtast: t.forward(-200)

Vi er nu gået 200 pixels hen ad X’ negative akse.

Øvelser: Præcis det samme kan vi gøre med Y. Prøv, med de funktioner vi kender(left, right, home og forward), at gå 100 pixels op ad Y’s positive akse og 100 pixels ned. Husk at brug left og right funktionerne, når du roterer på aksen. Den skulle gerne se ud som forneden, når du er færdig.


Lad og prøve at se hvordan vi også kan navigere i vores canvas. Nu hvor vi kender koordinatsystemet, der bliver brugt, kan vi lettere tilgå goto-funktionen. Den går hen til det punkt på koordinatsystemet, som vi ønsker. Vi indtaster allerførst t.goto(0,0) og går tilbage til udgangspunkter. Ved hjælp af goto-funktionen er vi nu gået tilbage til de to aksers skæringspunkter på punktet 0,0.

Vi skriver et nyt tal. Lad os prøve med en negativ X akse og en positiv Y. Indtast: t.goto(-325, 165). Vi får nedenstående resultat: goto-funktionen lader os bevæge os rundt på de usynlige akser, som er på det hvide canvas. Nogle gange minder funktioner meget om hinanden i turtle modulet. Der ville være nogle, som i stedet for at skrive go, ville have skrevet setpos. Det kan godt forvirre lidt. Bare husk, at så længe det du laver virker, fungerer det.


Lad os få vores turtle hen i den modsatte retning. Vi indtaster t.goto(200, -200)

Som man kan se, slipper stregen aldrig vores pil. Det kan hurtigt komme til at se meget forvirrende ud med så mange streger. Øvelser: Prøv at søg hjælp til vores Pen, og find frem til, hvordan man eventuelt kan tage kuglepennen op, så den ikke hele tiden tegner lige i hælene på pilen. Du finder som tidligere nævnt hjælp ved help(t) Husk at brug help() funktionen!! Den er guld værd og vil spare dig for mange frustrationer. Jeg skriver løsningen på næste side. Hvis du ikke kan huske alle funktionerne, så søg dem i directory ved at skrive dir(t).

Ved at indtaste dir(t) fandt man en funktion, der hed penup. Gennem help(t.penup) kan vi læse, at dette er funktionen, der hjælper os med at tage pennen op fra vores canvas. Indtast: t.penup() Indtast derefter: t.goto(30, -200)

Vi kan se at penup-funktionen virker efter hensigten. Vi har bevæget os ned på 30, -200 uden at efterlade en streg.


Når du vil begynde at tegne streger igen benytter du pendown; modstykket til pendown. Sådan er det i turtle modulet. Rigtig mange funktioner har deres modstykker. Det har forward også. Indtast: t.pendown() Forwards modstykke er backward. Indtast t.backward(400). pendown-funktionen fik lagt vores pen på vores canvas, og derefter fik vi ved brug af backward-funktionen sat en streg 400 pixels tilbagerettet fra pilens retning.

Lad os lave en reset og viske alt ud, så vi kan få et blankt canvas at tegne på. Indtast: t.reset()

Former Indtast: t.penup() Lad os herefter gå hen ad X-aksens negative retning, så vi lander på punktet -420, og gå derefter ned ad Y-aksen, så vi lander på punktet -300, så vi står på koordinaterne (-420, -300). t.goto(-420, 300)


Indtast: t.pendown() Vi vil nu tegne en tyk, grøn streg, som går hen på akserne med modsatte fortegn. Inden du læser videre er mit råd igen, at se på dir(t) for at finde mulige emner til funktioner, efterfulgt af help-funktionen, som beskriver funktionerne. Når du har gjort ovenstående, har du formentlig, fundet frem til, at vi ved hjælp med funktionen pencolor kan tegne vores pens farver, og du har fundet ud af at pensize kan ændre pennens tykkelse. Indtast: t.pencolor(”green”) indtast: t.pensize(4) indtast: t.forward(840) Øvelse: Find ud af hvorfor jeg skriver forward(840) og derved går 840 pixels frem ad på X aksen for at opnå symmetri. Hvordan kom jeg frem til at tallet skulle være 840?

Der er nu skabt en lige linje, som danner symmetri. Jeg dannede symmetrien ved at gange det dobbelte af 420, som var vores startkoordinat på X: (-420) * (-2) = 840

Vi lader pennen komme op igen. Indtast t.penup(), og gå derefter hen på 0 på X aksen og 320 på Y aksen ved at indtaste t.goto(0, -300)


Vi står nu på midten af den grønne streg på koordinaterne (0, -300)

Vi lægger pennen ned igen . Indtast: t.pendown() Skfit derefter størrelsen på pensize ud til 1. Indtast: t.pensize(1) Derefter ændrer vi vores farvevalg og benytter color-funktion i stedet for en pencolor. Det gør vi fordi, vi ønsker at udfylde en hel figur. Indtast: t.color(”black”, ”brown”) I ovenstående er ”black” linjen, mens ”brown” er farven der udfyldes med. Derefter indtaster vi: t.begin_fill() Vi laver et loop. Det gør ikke noget, hvis du ikke kender til loops. Det er ikke formålet med øvelserne, at gå i detaljer med loops, men følg med så godt du kan. Vis indtaster: for lines in range(3): t.left(90) t.forward(80) Her benytter vi et for-loop til at loope 3 gange. Lines er vores variabel, som vi tildeler at gå 90 grader til venstre og 80 pixels frem til hver af de 3 loops. Husk i øvrigt luft ved hver linje i loopet. Python er meget striks omkring indentation(til gengæld slipper man for tuborgklammer). Luften imellem hver linje er 4 mellemrum eller en gang med tabulator-tasten. For det meste gør Python dog selv arbejdet og sætter automatisk luft inde i et loop. Til allersidst afslutter vi med: t.end_fill()


Her er koden som helhed: Denne kode laver en boks, som er udfyldt med brun farve.

Vores tegning skal nu se sådan ud:

Rotér nu pilen 180 grader, så den peger opad imod Nord. Indtast: t.left(180) Gå derefter 80 pixels fremad. Indtast: t.forward(80) Vi ønsker nu at lave en større kasse, så den brune firkan fremstår som en mindre åbning. Gå 120 pixels fremad. Indtast t.forward(120) Rotér derefter 90 grader til højre. Indtast t.right(90) Gå derefter 280 pixels frem. Indtast: t.forward(280) Rotér 90 grader til højre. Indtast: t.right(90) gå derefter 200 pixels ned. Indtast: t.forward(200)


Lad os prøve med endnu et loop som vi udfylder med en blå farve. Indtast nedenstående: t.color(”black”, ”blue”) t.begin_fill() for lines in range(4): right(90) forward(350) t.end_fill()

Som nævnt udfyldes figuren med blå – linjen omkring er sort. Loopet forekommer 4 gange, hvor variablen lines bevæger sig 90 grader mod højre og fremad 350 pixels for hver gang. Øvelse: Hvad sker der hvis vi i stedet for bruger det første loop? Hvorfor roterer vi til højre og ikke venstre som på den anden? Hvorfor looper vi mon ikke 3 gange?

Men noget er galt. Vores figur er her, men de andre streger er væk…

Øvelser: Hvorfor tror du dette sker?


Python læser vores kommandoer fra start til ende. Det har derfor meget stor betydning, hvor du placerer en kommando henne. Faktisk er der ikke noget som er forsvundet. De andre former og farver bliver bare læst af Python inden den sidste store blå flade, som dækker dem. Imidlertid er problemet, at vi har benyttet vores shell og ikke skrevet koderne ned på en tom fil, hvor vi kan slette. Det er altid en god idé at gøre dette, når man arbejder med længere programmer.

Editor Når vi arbejder på en fil, har vi brug for en editor. Indtil nu har jeg blot brugt terminalen inde i Linux til at arbejde i Python Shell. Den har været fin, men den har også sine begrænsninger. Jeg vil anbefale en overskuelig editor. Personligt bruger jeg – til eksemplerne – gedit. Notepad++ er også fin. I gedit kan man bare lave editoren om til at benytte Pythons syntaks. Tryk på “Plain Text”feltet og ændre til Python 3.

Vi vil nu arbejde I editoren og gemme den som en python fil, der kan hentes frem og læses af Python der eksekverer vores Turtle Grafik. Det er ikke et kursus i at benytte editoren, men i Linux kan man fx eksekvere en Python fil ved at skrive python min_python_fil.py i samme folder som filen befinder sig i. I Pythons IDLE trykker du på ”run” eller F5. I bund og grund copy-paster jeg vores tidligere kode.


Koden som vi allerede kender. Kommentarer er skrevet ved funktionerne første gang de forekommer. Vi får stadig den samme blå boks foran. Men fordi vi arbejder med en editor, kan vi meget nemmere ændre på rækkefølgen, hvilket ikke lod sig gøre i Python Shell. ”Nyt loop” er den blå boks.


Vi bytter om på det sidste loop og læg mærke til, at right er byttet om til left i ”Blaa boks”.


Den blå boks er nu bag ved den brune og stregerne. De har altså hele tiden været der, men Python læser nedad, og derefter er det ikke efterladt til tilfældighederne, hvordan vi skriver vores kode.

Øvelse: Prøv at lav forskellige former og streger


Mønstre Turtle grafik kan være sjovt at danne mønstre i. Her er nogle mønstre jeg selv har lavet:


Mønstrene bliver til ved hjælp af loops. Præcis som vi er blevet introduceret for i ovenstående. Disse loops har bare ofte rigtig mange gentagelse til sammenligning med de øvrige kapitler, hvor vi brugte 3 og 4 loops skal vi lave loops med 360 omgange. Et godt råd til at arbejde med loops er, at tegne loopet på et stykke papir. Det er i hvert fald min erfaring.

Mit eget arbejdsbord. Blyanter med forskellige tykkelser(kan du huske pensize...), en bog med matematiske formler(den får vi ikke brug for her, men af og til kan man lege med pi og anden trignometri), en blok hvor loopet er tegnet, og en pakke farveblyanter(som i pencolor). Måske er det kedeligt at tegne inden man går i gang på computeren, men det vil spare dig for meget tid. Mange studier siger, at man både tænker og husker bedre når man bruger blyant og papir frem for at sidde foran computeren. Kreativiteten bliver kort og godt makismeret.


Ovenstående tegning viser vores loop, hvor variablen i starter med 0 og går 100 gange frem. For hvert loop roterer den 90 grader til venstre og gå i frem ad. Dvs at når loopet starter på 0 er i = 0, men når eksempelvis når til det 30. loop er i = 30 pixels. Den drejer altså og bliver større i pixels for hvert loop, og det er denne effekt, som får grafikken til at se pæn ud.


Sådan eksekverer vi loopet: import turtle t = turtle.Pen() t.hideturtle() for i in range(360): t.forward(i) t.left(90) t.speed(0)

Vi præsenteres for to nye funktioner, nemlig hidteturtle og speed. Hideturtle gemmer pilen væk og speed bestemmer hastigheden på vores animation, hvor 0 er den hurtigste hastighed.


Vi har indtil videre været glade for lige numre, når vi har arbejdet med vinkler. Fx er 90 grader til enten venstre eller højre brugt en del. Som sagt kan vi bevæge os i alle 360 grader. Prøv først at lave en reset på canvaset, og leg lidt med vinklerne.

Leg med vinklerne og se hvor de fører hen Vinkler kan blive enormt spændende i turtle grafik, hvis vi udfordrer os selv til at lege med dem. Prøv fx erstatte left(90) med left(91) og se hvad den lille ekstra vinkel gør. Det er fordi, den vinkles 360 gange i et loop og derfor kommer til, at nå rigtig mange gange rundt.


Ovenstående grafik er skrevet således: for i in range(360): t.forward(i) t.left(91) t.speed(0) Forskellen på ovensående og den første er altså blot en ekstra vinkel i loopet.

Her er venstre ændret til 43. Øvelse: Leg og vær kreativ med dine vinkler i loopet.


Du kan jo også ændre på pencolor og alle de andre funktoner, du har lært. Fx pendown og penup mv.

Her er t.pencolor(”red”) indsat i loopet.


Ønsker du flere farver i din grafik, kan en farve-variabel være en fin løsning. Se en variabel som en boks, hvor du opbevare alle de ting, som du ønsker den skal indeholde. I vores tilfælde skal vores variabel, som vi kalder farver indeholder en række forskellige farver. Når du arbejder med farver vil jeg igen slå på tromme for, at du først prøver dig frem på et stykke papir. Det giver nemlig en helt anden frihed at arbejde med farver uden for skærmen, da man ikke skal tænke på farvernes navne. Du sanser først og fremmest, når du ser farver og du tænker jo ikke på, hvad dens navn er lige når du ser en farve. Det kommer først bagefter. Når vi har fundet vores farver sætter vi dem ind som en liste i variablen farver = [”red”, ”green”, ”yellow”, ”blue”, ”purple”]


Hele koden er som følger: import turtle from turtle import * t = turtle.Pen() hideturtle() #Baggrunden skifter til sort ved brug af bgcolor bgcolor("black") #Variablen farver som indeholder liste med farveprne farver = ["red", "green", "yellow", "blue", "purple"] #Loop for i in range(360): t.forward(i) t.left(110) t.pencolor(farver[i%5]) t.speed(0) Der sker en hel del her. Først og fremmest er baggrunden gjort sort ved hjælp af bgcolor-funktionen. Derefter indsætter vi 5 farver i variablen farver. pencolor(farver[i%5]) skifter ny farve for hvert loop.

Reset dit canvas. Indtast t.reset() Hvis du ønsker at ændre din pil til en anden form kan du benytte funktionen shape. Prøv at indtast t.shape(”turtle”) og se hvordan din pil ændre form til en skildpadde. Indtast herefter t.circle(150)


Lad os prøve at ændre ovenstående kode med en cirkel i stedet for en lige linje. Indtast: import turtle from turtle import * t = turtle.Pen() hideturtle() #Baggrunden skifter til sort ved brug af bgcolor bgcolor("black") #Variablen farver som indeholder liste med farveprne farver = ["red", "green", "yellow", "blue", "purple"] #Loop for i in range(360): t.circle(i) t.left(110) t.pencolor(farver[i%2]) t.speed(0) Årsagen til at den fylder hele ens canvas , skyldes at circle udregnes i diameter. Dvs. at hvert loop skaber en ny diameter i cirklerne. Først starter vi med 0, men den ender med at blive temmlig stor når vi er nået til 360. Prøv eventuelt at gør den mindre.

En anden ting vi arbejder med er, at der kun benyttes 2 farver. Ved at ændre de oprindelige 5 til 2 i t.pencolor(farver[i%2]) får vi dette ret flotte farvemønster.


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.