Ga naar hoofdinhoud

Veelgemaakte fouten

Python geeft je altijd een foutmelding als er iets misgaat. Op deze pagina vind je de meest voorkomende fouten en hoe je ze oplost.

tip

Lees de foutmelding altijd goed. Python vertelt je meestal precies wat er mis is en op welke regel.

AttributeError — typefout in een attribuutnaam​

De play-bibliotheek gebruikt de Amerikaanse spelling color, zonder u. Schrijf je colour, dan hangt het van je code af wat er gebeurt.

Aanpassen gaat stilletjes fout. Python maakt dan een nieuw attribuut met die naam aan. Je krijgt geen foutmelding, maar de cirkel blijft zwart:

Spel laden...

Dit is de vervelendste variant, want er lijkt niets mis te zijn. Zie je een aanpassing niet terug op het scherm, controleer dan als eerste de spelling.

Opvragen geeft wél een foutmelding:

AttributeError: 'Circle' object has no attribute 'colour'
Spel laden...

Oplossing: gebruik color in plaats van colour.

Meer uitleg: 1.6 Je vorm aanpassen


TypeError — getal optellen bij tekst​

Foutmelding:

TypeError: can only concatenate str (not "int") to str

Je probeert een getal (int) direct samen te voegen met tekst (str). Dat mag niet in Python.

Spel laden...

Oplossing: zet het getal eerst om naar tekst met str():

Spel laden...

Meer uitleg: 4.5 Een score bijhouden met global


NameError — variabele niet gevonden​

Foutmelding:

NameError: name 'cirkel' is not defined

Je gebruikt een variabele die nog niet bestaat, of je hebt de naam verkeerd gespeld.

Spel laden...

Oplossing: controleer de spelling en zorg dat de variabele vóór gebruik aangemaakt is.

Meer uitleg: 1.6 Je vorm aanpassen, of Jij als variabele in de python-cursus.


IndentationError — verkeerde inspringing​

Foutmelding:

IndentationError: expected an indented block

De code onder een def, if, of for moet ingesprongen zijn (4 spaties of 1 tab).

Spel laden...

Oplossing: spring de code in met 4 spaties:

Spel laden...

Meer uitleg: Functies in de python-cursus.


SyntaxError — await buiten async​

Foutmelding:

SyntaxError: 'await' outside function

await mag alleen gebruikt worden in een async def functie.

# FOUT
@play.when_key_pressed("space")
def wacht():
await play.timer(seconds=1)

Oplossing: voeg async toe voor def:

Spel laden...

Meer uitleg: 5.2 Wachten met async en await


when_key_pressed reageert niet​

Je hebt @play.when_key_pressed gebruikt maar er gebeurt niets als je op de toets drukt.

Controleer het volgende:

  1. Staat @play.when_key_pressed boven de functie? De decorator moet direct op de regel vóór def staan.
  2. Klopt de toetsnaam? Gebruik "space" voor spatie, "up" / "down" / "left" / "right" voor pijltjes, en kleine letters voor letters ("a", "b", ...).
Spel laden...

Meer uitleg: 4.1 Gebeurtenissen


ValueError — ongeldige kleur of hex-code​

Foutmelding:

ValueError: You gave a color name we didn't understand: 'FF0000'
Try using a hex code like '#FF0000' or '#F00',
or the RGB number form e.g. '(0, 255, 255)'.

play begrijpt de kleur die je opgegeven hebt niet. Dit komt vaak voor bij hex-codes (sinds versie 3.3.3 beschikbaar). Een paar veelgemaakte fouten:

  1. # vergeten: een hex-code begint altijd met #. Gebruik '#FF0000', niet 'FF0000'.
  2. Verkeerde lengte: een hex-code heeft # plus 6 tekens (of de korte vorm: # plus 3 tekens). '#FF00' werkt niet.
  3. Ongeldige tekens: alleen cijfers 0-9 en letters A-F mogen. '#GGGGGG' werkt niet.
  4. Typefout in kleurnaam: 'reed' in plaats van 'red'.
Spel laden...

Oplossing: gebruik een geldige hex-code, kleurnaam of RGB-tuple. Alle drie de cirkels hieronder zijn rood:

Spel laden...

Meer uitleg: 1.2 Je eerste cirkel


global vergeten​

Foutmelding:

UnboundLocalError: cannot access local variable 'score' where it is not associated with a value

Je probeert een variabele buiten een functie aan te passen, maar vergeet global te schrijven.

Spel laden...

Oplossing: voeg global score toe bovenaan de functie:

Spel laden...

Meer uitleg: 4.5 Een score bijhouden met global, of Scope in de python-cursus voor het achterliggende idee.


Er komt geen geluid uit​

Geen foutmelding, geen geluid. Dit is de lastigste van de hele pagina, want je programma draait gewoon door.

Spel laden...

Oorzaak: play vindt het bestand niet. In plaats van te stoppen schrijft het een regel in je console en gaat het verder:

Could not load sound file 'klik.mp3'
No sound loaded. Use the 'load' method first.

Oplossing: kijk als eerste in je console — daar staat het wél. Controleer daarna of het bestand in dezelfde map staat als je Python-bestand, en of de naam en de extensie precies kloppen.

Meer uitleg: 8.1 Geluid afspelen


FileNotFoundError — video niet gevonden​

Foutmelding:

FileNotFoundError: Video file 'intro.mp4' not found.

Anders dan geluid stopt video wél meteen. Dat is prettiger: je weet direct wat er mis is.

Spel laden...

Oorzaak: het .mp4-bestand staat niet naast je Python-bestand, of de naam klopt niet.

Oplossing: zet het bestand in dezelfde map en controleer de spelling. Krijg je in plaats hiervan een melding over een ontbrekende module av, installeer die dan met pip install av.

Meer uitleg: 8.2 Video afspelen


ValueError — een video-gebeurtenis zonder video​

Foutmelding:

ValueError: It looks like you wrote @play.when_video_ends without brackets.
Put the video in brackets so play knows which video you mean:

@play.when_video_ends(my_video)
def klaar():
...
Spel laden...

Oorzaak: je bent de haakjes vergeten. Bij een toets schrijf je @play.when_key_pressed('space') en bij een vorm @bal.when_clicked zónder haakjes, dus het is een makkelijke vergissing. Een video-gebeurtenis hoort altijd te weten over wélke video hij gaat.

Oplossing: zet de video tussen haakjes.

# FOUT
@play.when_video_ends
def klaar():
...

# GOED
@play.when_video_ends(intro)
def klaar():
...

Dezelfde melding krijg je bij lege haakjes (@play.when_video_ends()) en als er iets in staat dat geen video is.

Meer uitleg: 8.3 Reageren op een video


TypeError — een when_changed-functie zonder parameter​

Foutmelding:

TypeError: veranderd() takes 0 positional arguments but 1 was given

Oorzaak: een schuifbalk, uitklapmenu of invoerveld geeft zijn nieuwe waarde mee aan jouw functie. Vergeet je die parameter, dan past de aanroep niet.

Spel laden...

Oplossing: zet een parameter tussen de haakjes. Hoe je hem noemt maakt niet uit, als er maar één staat:

@schuif.when_changed
def veranderd(waarde):
print(waarde)

Meer uitleg: 7.2 Schuiven en aanvinken


Eén toetsdruk doet het meerdere keren​

Je drukt één keer op spatie en je springt twee of drie levels vooruit.

Oorzaak: je @play.when_key_pressed staat binnen een functie die je meer dan één keer aanroept, bijvoorbeeld een bouw_level(). Elke aanroep zet er een luisteraar bij, en die reageren daarna allemaal tegelijk.

# FOUT
def bouw_level():
@play.when_key_pressed('space')
def spatie():
volgende_level()

# GOED
def bouw_level():
...

@play.when_key_pressed('space')
def spatie():
volgende_level()

Oplossing: registreer toetsen en muis één keer, buiten de functie die je herhaalt. Gebeurtenissen op een vorm (@bal.when_clicked, @bal.when_touching(...)) mogen er wél in: die verdwijnen samen met hun vorm.

Meer uitleg: 9.2 Levels met andere vormen


De bal gaat niet door een tekst heen​

Je bal stuitert terug tegen een tekst, een scorebord of een vorm die je onzichtbaar hebt gemaakt.

Oorzaak: in coderius-play is elke vorm massief, ook een tekst en ook zonder start_physics(). Een tekst is voor de bal net zo goed een muur als een vierkant, en transparency=0 verandert daar niets aan.

Oplossing: maak de tekst een sensor. Dan gaat de bal erdoorheen, en when_touching werkt nog steeds. Geef ook can_move=False mee, anders valt de tekst van het scherm.

import play

bal = play.new_circle(x=-300, radius=20)
bal.start_physics(obeys_gravity=False, x_speed=60)

tekst = play.new_text("Hallo", font_size=60)
tekst.start_physics(can_move=False, sensor=True)
Spel laden...

Meer uitleg: 2.3 Fysica-eigenschappen