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.
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:
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'
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.
Oplossing: zet het getal eerst om naar tekst met str():
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.
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).
Oplossing: spring de code in met 4 spaties:
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:
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:
- Staat
@play.when_key_pressedboven de functie? De decorator moet direct op de regel vóórdefstaan. - Klopt de toetsnaam? Gebruik
"space"voor spatie,"up"/"down"/"left"/"right"voor pijltjes, en kleine letters voor letters ("a","b", ...).
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:
#vergeten: een hex-code begint altijd met#. Gebruik'#FF0000', niet'FF0000'.- Verkeerde lengte: een hex-code heeft
#plus 6 tekens (of de korte vorm:#plus 3 tekens).'#FF00'werkt niet. - Ongeldige tekens: alleen cijfers
0-9en lettersA-Fmogen.'#GGGGGG'werkt niet. - Typefout in kleurnaam:
'reed'in plaats van'red'.
Oplossing: gebruik een geldige hex-code, kleurnaam of RGB-tuple. Alle drie de cirkels hieronder zijn rood:
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.
Oplossing: voeg global score toe bovenaan de functie:
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.
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.
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():
...
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.
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)
Meer uitleg: 2.3 Fysica-eigenschappen