Python code bij Turtle
De code is ook als Python Notebook te downloaden
Turtle
Inhoud
- Beschrijving van Turtle
- Belangrijke commando's
- Programma: Het opvullen van een figuur
- Programma: Spiraal
- Programma: Pythagoras Olympiade opgave 374
- Programma: Gebruik van een achtergrondplaatje
- Programma: Moderne kunst
- Programma: Zelf tekenen
- Programma: toegift
- Programma: Fractal
- Programma: Woordl
- Slotopmerkingen
1. Beschrijving van Turtle
Turtle (Schildpad) is een pakket dat kan worden gebruikt om op een eenvoudige manier te kunnen tekenen. De oorsprong van Turtle ligt in 1948. Toen werd er een robot ontwikkeld die geprogrammeerd kon worden om een bepaald patroon af te leggen. Het werd later een speeltje voor kinderen. In de programmeertaal Logo werd het iets om kinderen iets uit te leggen over programmeren. Inmiddels is het ook overgenomen door Python.
De basis is onveranderd gebleven. De robot in 1948 had de vorm van een schildpad. Deze schildpad kon vooruit en achteruit, en daarnaast in een willekeurige hoek draaien. Dat zijn eigenlijk alle ingredienten.
Er wordt een apart scherm geopend waarop een klein driehoekje zichtbaar is. Dit is de schildpad. Vervolgens zie je de schildpad bewegen.
2. Belangrijke commando's
- turtle.forward(Lengte): Over de afstand Lengte gaat de schildpad vooruit.
- turtle.backward(Lengte): Over de afstand Lengte gaat de schildpad achteruit.
- turtle.left(Hoek): Over de hoek Hoek draait de schildpad naar links. De hoek wordt uitgedrukt in graden.
- turtle.right(Hoek): Over de hoek Hoek draait de schildpad naar rechts.
- turtle.begin_fill() t/m turtle.end_fill(): Het gebied waar de schildpad omheen gelopen is wordt gekleurd.
- turtle.color(LijnKleur[, VullingKleur]): Hiermee kun je de lijn die de schildpad een kleur meegeven. Gebieden die worden opgevuld krijgen een tweede kleur. Je kunt gebruik maken van een standaard bibliotheek met kleurnamen zoals 'black', 'blue', 'green', 'pink', 'red', 'white', 'yellow', ... We hebben een overzicht met kleuren op de site staan. Je kunt ook gebruik maken van de RGB-code:
- turtle.colormode(mode): Er zijn verschillende manieren om met RGB-codes kleuren in te voeren. Als mode = None dan kan gebruik worden gemaakt van de hexadecimale invoer. De invoer voor rood is "#FF0000". Als mode = 255, dan kunnen voor R, G en B drie getallen tussen 0 en 255 worden ingevoerd. In dit geval wordt rood gerepresenteerd door (255,0,0). Tenslotte kan mode = 1 zijn. Dan liggen deze drie getallen tussen 0 en 1. Nu is rood (1,0,0). We zullen veelal turtle.colormode(255) gebruiken.
- turtle.pencolor(r,g,b): Alleen de kleur van de lijn/rand wijzigen.
- turtle.penup() en turtle.pendown(): Tijdelijk de pen van het papier halen.
- turtle.fillcolor(r,g,b): Alleen de kleur van de vulling wijzigen.
- turtle.position(): Hiermee krijg je informatie waar de pen zich bevindt.
- turtle.goto(x,y): Hiermee kun je de pen laten bewegen naar (x,y).
- turtle.speed(): Varieert van 1 (langzaam) tot 10 (snel), of 0, in dit geval zal de snelheid zo hoog mogelijk zijn.
- turtle.done(): Ter afsluiting van de module. Hierna pas kan het aparte scherm worden afgesloten.
- turtle.setworldcoordinates(x1,y1,x2,y2): Hiermee kun je (vooraf) je eigen scherm creeren waarop de schildpad actief is.
- turtle.exitonclick(): Programma wordt afgesloten bij aanklikken van scherm.
- turtle.bgpic: Je kunt op de achtergrond een plaatje zetten.
- turtle.TurtleScreen._RUNNING=True: Voor gebruikers van Notebook is dit een belangrijke regel. Zonder deze regel (helemaal bovenaan) werkt het programma niet (een bug).
Op internet staat een uitgebreidere lijst met commando's. Je kunt ook naar de website https://docs.python.org/3/library/turtle.html gaan.
3. Programma: Het opvullen van een figuur
# Turtle # 3a: Het opvullen van een figuur. Standaard Turtle voorbeeld. # Hoek kan worden gevarieerd. # Kies Hoek uit bijvoorbeeld 135, 150, 160, 170, 175 import turtle Hoek = 135 turtle.TurtleScreen._RUNNING=True turtle.title('Standaard Turtle voorbeeld') turtle.speed(0) turtle.color('red', 'aqua') turtle.begin_fill() while True: turtle.forward(200) turtle.left(Hoek) if abs(turtle.pos()) < 1: break turtle.end_fill() turtle.done()
# Turtle # 3b: Het opvullen van een figuur # Je kunt zelf Hoek1 en Hoek2 varieren. import turtle turtle.TurtleScreen._RUNNING=True Lengte = 300 Hoek1 = 160 Hoek2 = 100 turtle.title("Programma 1: Opvullen van een figuur") turtle.color('green', 'cornsilk') turtle.speed(10) turtle.begin_fill() count = 0 while count < 500: turtle.forward(Lengte) turtle.left(Hoek1) turtle.forward(Lengte) turtle.left(Hoek2) if abs(turtle.pos()) < 1: break count += 1 turtle.end_fill() turtle.done()
# Turtle # 4: Het opvullen van figuren # Achtereenvolgens twintighoek, negentienhoek, ..., driehoek import turtle turtle.TurtleScreen._RUNNING=True turtle.title("Programma 2: twintighoek, negentienhoek, ..., driehoek") turtle.speed(9) turtle.right(90) turtle.penup() turtle.forward(300) turtle.right(90) turtle.forward(50) turtle.pendown() turtle.left(180) turtle.pencolor('blue') turtle.colormode(255) for nhh in range(18): nh = 20 - nhh h = 360/nh turtle.fillcolor(255,nh*12,nh*12) turtle.begin_fill() for k in range(nh): turtle.forward(100) turtle.left(h) turtle.end_fill() turtle.done()
4. Programma: Spiraal
# Turtle # 5: Spiraal # Hoeken en Ronden kan worden gevarieerd. import turtle turtle.TurtleScreen._RUNNING=True turtle.title("Programma 3: Spiraal") turtle.color('black', 'yellow') turtle.speed(0) Hoeken = 6 Ronden = 20 Start = 30 Delta = max(Start // (Hoeken+2), 2) Size = Start turtle.begin_fill() for k in range(Hoeken*Ronden): turtle.forward(Size) turtle.left(360/Hoeken) Size += Delta turtle.goto(0,0) turtle.end_fill() turtle.done()
5. Programma: Pythagoras Olympiade opgave 374
# Turtle # Pythagoras Olympiade opgave 374 (Jaargang 57/4, Oplossing Jaargang 58/1) # Hieronder is een schets met twee regelmatige achthoeken en # twee gelijkzijdige driehoeken. Je kunt je voorstellen dat je # dit patroon herhaalt. Kom je dan precies bij het begin uit? # Bonuspunt # Voor welke regelmatige n-hoek (n > 6) kun je een patroon # creeren waarbij je precies terugkeert bij het begin. # Klik steeds op het rode vierkant in het midden om verder te gaan # (1) Plaatje schetsen horende bij deze opgave # (2) Plaatje oplossing schetsen horende bij deze opgave # (3) Andere oplossingen schetsen # Voor de uitwerking van deze opgave zie # https://www.pyth.eu/oplossingen-pythagoras-olympiade-57-4 import turtle DATA = [(100, 150, 8, 24, 2), (60, 250, 8, 24, 12), (40, 270, 7, 42, 21), (60, 180, 9, 18, 9), (50, 100, 12, 12, 6), (50, 80, 15, 10, 5), (40, 50, 24, 8, 4), ] MAXCNT = 6 def RedButton(): # Tekenen van rode button in het midden turtle.color('black', 'red') turtle.penup() turtle.goto(-50,-50) turtle.pendown() turtle.begin_fill() for m in range(4): turtle.forward(100) turtle.left(90) turtle.end_fill() turtle.penup() turtle.goto(0,0) return def Draw(x, y): global cnt (Lengte, InitialisatieLengte, Hoeken1, Hoeken2, Herhalingen) = DATA[cnt] turtle.clear() RedButton() # Turtle wordt naar juiste positie verplaatst turtle.pendown() turtle.left(90) turtle.penup() turtle.forward(InitialisatieLengte) turtle.left(90) turtle.forward(Lengte/2) turtle.pendown() turtle.left(180) # Tekenen van figuur for m in range(Herhalingen): turtle.color('black', 'cornsilk') turtle.begin_fill() for k in range(Hoeken1): turtle.forward(Lengte) turtle.left(360/Hoeken1) turtle.end_fill() turtle.forward(Lengte) turtle.right(360/Hoeken2) turtle.color('black', 'aqua') turtle.begin_fill() for k in range(3): turtle.forward(Lengte) turtle.left(120) turtle.end_fill() turtle.forward(Lengte) turtle.right(360/Hoeken2) # Turtle wordt weer terug geplaatst turtle.penup() turtle.goto(0,0) turtle.pendown() turtle.setheading(0) # Gereed maken van doorgaan of stoppen if (abs(x) < 50) & (abs(y) < 50): if cnt == MAXCNT: turtle.exitonclick() else: cnt += 1 return cnt = 0 turtle.TurtleScreen._RUNNING=True turtle.title("Programma 4: Pythagoras Olympiade opgave 374") screen = turtle.Screen() turtle.speed(0) RedButton() ### (1) Plaatje schetsen horende bij deze opgave ### (2) Plaatje oplossing schetsen horende bij deze opgave ### (3) Andere oplossingen schetsen (bonus opgave) screen.listen(0,0) screen.onclick(Draw, btn = 1, add=None) screen.mainloop()
6. Programma: Gebruik van een achtergrondplaatje
# Turtle # Gebruik van achtergrondplaatje # Zorg er voor dat FILENAME wel op de goede plaats staat. # Gebruik van exitonclick import turtle turtle.TurtleScreen._RUNNING=True FILENAME = "./Pythagoraslogo.png" turtle.shape("turtle") turtle.bgpic(FILENAME) turtle.forward(250) turtle.exitonclick()
7. Programma: Moderne kunst
# Moderne kunst turtle.TurtleScreen._RUNNING=True i = 1 turtle.tracer(n=2, delay=0.1) Doorgaan = True while Doorgaan: try: turtle.forward(1+i/3) turtle.right(30+i/6) i += 1 if i == 1500: Doorgaan = False except turtle.Terminator: break turtle.done()
8. Programma: zelf tekenen
# Hiermee kun je zelf tekenen # Bron: https://www.bhutanpythoncoders.com/ from turtle import * turtle.TurtleScreen._RUNNING=True shape("turtle") color("blue") shapesize(2) speed(10) pensize(3) def draw(x,y): # stop backtracking ondrag(None) # drawing as per the x and y # coordinates of mouse movement goto(x, y) # Call fun again ondrag(draw) ondrag(draw) # take screen in mainloop mainloop()
9. Programma: toegift
# Toegift. Bron: onbekend # Kies Hoeken tussen 10 en 60 import turtle import math turtle.TurtleScreen._RUNNING=True turtle.tracer(n=2, delay=0.1) Hoeken = 10 Basis = 600/Hoeken T = 2*math.cos(math.pi/Hoeken) Size = Basis/T for k1 in range(Hoeken): turtle.forward(Size) turtle.left(360/Hoeken) for k2 in range(2*Hoeken): turtle.left(180/Hoeken) turtle.forward(Basis) turtle.done()
10. Programma: Fractals
# tientallen fractals zijn te vinden op: # https://pythonturtle.academy/t-square-fractal-with-python-turtle-source-code/ import turtle turtle.TurtleScreen._RUNNING=True screen = turtle.Screen() screen.title('T-square Fractal - PythonTurtle.Academy') screen.setup(1000,1000) screen.setworldcoordinates(-1000,-1000,1000,1000) screen.tracer(0,0) turtle.speed(0) screen.bgcolor('white') turtle.hideturtle() turtle.pencolor('white') def stacksquares(x,y,length,n): if n==0: return stacksquares(x-length/2,y-length/2,length/2,n-1) stacksquares(x+length/2,y+length/2,length/2,n-1) stacksquares(x-length/2,y+length/2,length/2,n-1) stacksquares(x+length/2,y-length/2,length/2,n-1) turtle.up() turtle.goto(x-length/2,y-length/2) turtle.down() turtle.seth(0) turtle.begin_fill() for _ in range(4): turtle.fd(length) turtle.left(90) turtle.end_fill() turtle.up() turtle.goto(-800,-800) turtle.begin_fill() turtle.fillcolor('black') for _ in range(4): turtle.fd(1600) turtle.left(90) turtle.end_fill() turtle.fillcolor('white') stacksquares(0,0,800,7) screen.update() turtle.done()
11. Programma: Woordl
# Woordl omgeving, ook te vinden bij PythonTurtle.Academy # De rollen zijn omgekeerd: de computer raadt een woord dat jij # in gedachten hebt. Het programma is niet zo geweldig. Er zijn diverse # woorden waarvoor dit programma meer dan 6 beurten nodig heeft, en dan heb # je een foutmelding. # Let op: je hebt wel een bestand nodig met woorden. # Bijvoorbeeld: ./woorden5.txt, zie bij woordl. import random import turtle from tkinter import * from tkinter import messagebox turtle.TurtleScreen._RUNNING=True screen = turtle.Screen() screen.setup(1000,1000) screen.title("Wordle Solver - PythonTurtle.Academy") turtle.speed(0) turtle.hideturtle() screen.tracer(0,0) screen.bgcolor('black') turtle.color('white') gs = 0 state = [] for i in range(6): state.append([-1]*5) def getwords(words, cs, count=False): res = [] cnt = 0 for w in words: t = list(w) flag = True cnt = dict() # first loop checks only positions are set for l,p in cs: if p<0: continue if cs[(l,p)] > 0: if t[p] == l: t[p] = '*' if l in cnt: cnt[l] += 1 else: cnt[l] = 1 else: flag = False break else: if t[p] == l: flag = False break if (not flag): continue # second loop checks only positions are not set for l,p in cs: if p!=-1: continue v = 0 if l not in cnt else cnt[l] for _ in range(cs[(l,p)]-v): try: p = t.index(l) t[p] = '*' except ValueError: flag = False break if (not flag): break if (not flag): continue # third loops checks non-existent letter for l,p in cs: if p!=-2: continue if l in t: flag = False break if flag: if count: cnt += 1 else: res.append(w) if count: return cnt else: return res def guess_random(words): return random.choice(words) def draw_square(coord,s,fc='black'): turtle.up() x = coord[0] y = coord[1] turtle.goto(x-s/2,y-s/2) turtle.seth(0) turtle.down() turtle.fillcolor(fc) turtle.begin_fill() for _ in range(4): turtle.fd(s) turtle.left(90) turtle.end_fill() def get_coord(i,j): return -200+100*j, 300-100*i def draw_board(): turtle.pencolor('dark gray') for i in range(6): for j in range(5): draw_square(get_coord(i,j),80) def display_word(w): turtle.up() turtle.color('white') for i in range(5): x,y = get_coord(gs,i) turtle.goto(x,y-23) turtle.write(w[i].upper(),align='center',font=('Arial',40,'bold')) def update_cell(i,j): global w,state x, y = get_coord(i,j) turtle.pencolor('dark gray') if state[i][j] == 0: fc = 'dark gray' elif state[i][j] == 1: fc = 'goldenrod' else: fc = 'green' draw_square(get_coord(i,j),80,fc) turtle.up() turtle.color('white') turtle.goto(x,y-23) turtle.write(w[j].upper(),align='center',font=('Arial',40,'bold')) screen.update() def play(x,y): flag = False for i in range(6): if flag: break for j in range(5): cx, cy = get_coord(i,j) if (cx-x)**2 + (cy-y)**2 < 1600: flag = True ci = i cj = j break if not flag: return if ci != gs: return state[ci][cj] = (state[ci][cj] + 1) % 3 update_cell(ci,cj) def submit(): global state global gs global w,words for i in range(5): if state[gs][i] == -1: return cs = dict() for i in range(5): if state[gs][i] == 0: # letter doesn't exist cs[(w[i],-2)] = 1 else: if (w[i],-1) not in cs: cs[(w[i],-1)] = 1 else: cs[(w[i],-1)] += 1 if state[gs][i] == 1: cs[(w[i],i)] = 0 else: cs[(w[i],i)] = 1 words = getwords(words,cs) print("Aantal mogelijkheden:", len(words)) w = guess_random(words) gs += 1 display_word(w) if len(words) == 1: messagebox.showinfo("Done", "Congratulations!") turtle.bye() #screen.update() orig_words = [] FILENAME = './woorden5.txt' f = open(FILENAME,'r') for w in f: orig_words.append(w.strip()) cs = dict() words = getwords(orig_words,cs) w = guess_random(words) w = 'woord' draw_board() display_word(w) screen.update() screen.onclick(play) screen.onkey(submit, 'Return') screen.listen() screen.mainloop() #turtle.done() #turtle.exitonclick()
12. Slotopmerkingen
Je kunt heel veel doen met Turtle. Op de Pythagoras site kun je het programma downloaden. Er zijn diverse onderdelen waarmee je mooie plaatjes kunt maken, maar er is ook aandacht voor andere zaken. Onder andere kun je Turtle gebruiken om zelf spelletjes te programmeren. Twee spelletjes noemen we hier: Wordle en Snake.