Befehlsreferenz
Alle Befehle, die du auf CodeNatter für Turtle, Kara, Spiele, Fenster, Diagramme und mehr brauchst – kurz erklärt. Jedes Beispiel öffnest du mit „Im Editor öffnen“ und startest es dort.
Ein- und Ausgabe #
Mit print() zeigt dein Programm etwas in der Konsole, mit input() fragt es nach. input() liefert immer Text: für Zahlen int() oder float() drumherum. time.sleep() lässt das Programm warten.
Konsole
print(wert, …)Gibt Werte aus, durch Leerzeichen getrennt. sep=", " ändert den Trenner, end="" lässt den Zeilenumbruch weg.input("Frage: ")Wartet, bis eine Zeile eingegeben ist, und liefert sie als Text. Die Eingabezeile erscheint unter der Ausgabe.int(text)Macht aus Text eine ganze Zahl: int(input("Alter? ")).float(text)Macht aus Text eine Kommazahl (mit Punkt: 3.5).str(zahl)Macht aus einer Zahl Text, z. B. zum Zusammensetzen: "Punkte: " + str(p).f"Hallo {name}"f-String: Werte in geschweiften Klammern landen im Text.Warten und Zufall
time.sleep(sekunden)Wartet so viele Sekunden (auch 0.5). Die Seite bleibt dabei bedienbar, Stopp geht immer.time.time()Sekunden seit 1970 – die Differenz zweier Werte misst eine Zeit.random.randint(a, b)Zufällige ganze Zahl von a bis b (beide eingeschlossen).random.choice(liste)Ein zufälliges Element der Liste.random.random()Zufällige Kommazahl von 0 bis unter 1.Beispiel: Nach dem Alter fragen
Im Editor öffnen ↗alter = int(input("Wie alt bist du? "))
print("In 10 Jahren bist du", alter + 10)
Beispiel: Countdown mit sleep
Im Editor öffnen ↗import time
for i in range(5, 0, -1):
print(i)
time.sleep(1)
print("Start!")
Turtle #
Eine Schildkröte mit Stift läuft über die Fläche und zeichnet. Die Befehle sind dieselben wie im turtle-Modul von Python. Die Mitte ist (0, 0), nach oben wird y größer.
Bewegen
t = turtle.Turtle()Erzeugt eine Schildkröte. Mehrere sind erlaubt.t.forward(strecke)Geht vorwärts (kurz t.fd). t.back(strecke) geht zurück.t.left(winkel)Dreht sich nach links, t.right(winkel) nach rechts (in Grad).t.goto(x, y)Geht direkt zum Punkt (x, y), mit Strich, wenn der Stift unten ist.t.setheading(winkel)Blickrichtung setzen: 0 rechts, 90 oben, 180 links, 270 unten.t.circle(radius)Zeichnet einen Kreis; t.circle(50, 180) nur einen Halbkreis.t.home()Zurück zur Mitte, Blick nach rechts.t.speed(0)Tempo 1 (langsam) bis 10, 0 = sofort.Stift und Farbe
t.penup()Stift hoch: bewegen ohne zu zeichnen. t.pendown() setzt ihn wieder ab.t.pencolor("red")Stiftfarbe: Farbname auf Englisch oder "#ff8800".t.pensize(breite)Strichbreite in Pixeln.t.fillcolor("gold")Füllfarbe für begin_fill()/end_fill(). t.color("red", "gold") setzt beide.t.begin_fill()Ab hier wird die gezeichnete Form gemerkt, t.end_fill() füllt sie.t.dot(größe, "blue")Ein runder Punkt an der aktuellen Stelle.t.write("Text")Schreibt Text an die aktuelle Stelle, z. B. font=("Arial", 16, "bold").t.hideturtle()Versteckt die Schildkröte, t.showturtle() zeigt sie wieder.turtle.bgcolor("black")Hintergrundfarbe der Fläche.Tasten und Klicks
turtle.onkey(funktion, "Left")Ruft die Funktion beim Tastendruck auf ("Up", "space", "a" …). Vorher turtle.listen().turtle.onscreenclick(funktion)Ruft funktion(x, y) bei einem Klick oder Tipp auf.turtle.ontimer(funktion, ms)Ruft die Funktion nach so vielen Millisekunden einmal auf.turtle.done()Wartet auf Tasten und Klicks, bis du Stopp drückst (auch turtle.mainloop()).Beispiel: Gefülltes Quadrat
Im Editor öffnen ↗import turtle
t = turtle.Turtle()
t.color("darkgreen", "lightgreen")
t.begin_fill()
for i in range(4):
t.forward(100)
t.left(90)
t.end_fill()
Beispiel: Mit Pfeiltasten malen
Im Editor öffnen ↗import turtle
t = turtle.Turtle()
t.speed(0)
def links():
t.left(15)
def rechts():
t.right(15)
def vor():
t.forward(10)
turtle.listen()
turtle.onkey(links, "Left")
turtle.onkey(rechts, "Right")
turtle.onkey(vor, "Up")
turtle.done()
Kara #
Kara ist ein Marienkäfer auf einer Wiese. Die Welt malst du mit Zeichen in world("""…"""), die Befehle gibt es ohne import (wie im Buch). Kara schaut am Anfang nach rechts.
Die Welt
world("""…""")Baut die Welt aus Zeichen: @ Kara, # Baum, . Beere, $ Pilz, * Pilz auf Beere, + Kara auf Beere, Leerzeichen = Wiese.Handeln
move()Ein Feld vorwärts. Steht ein Pilz davor, schiebt Kara ihn mit, wenn dahinter Platz ist (wie Kisten in Sokoban).turnLeft()Dreht sich auf dem Feld nach links.turnRight()Dreht sich auf dem Feld nach rechts.putBerry()Legt eine Beere ab (nur, wo noch keine liegt).removeBerry()Isst die Beere unter sich.Fühlen (True oder False)
onBerry()Sitze ich auf einer Beere?treeFront()Ist vor mir ein Baum (oder der Rand)?treeLeft()Ist links von mir ein Baum?treeRight()Ist rechts von mir ein Baum?mushroomFront()Ist vor mir ein Pilz?- Läuft Kara gegen einen Baum oder den Rand, isst eine Beere, wo keine ist, oder schiebt einen Pilz gegen ein Hindernis, hält das Programm mit einer Fehlermeldung an.
- Sokoban-Idee: Bring jeden Pilz
$auf eine Beere – dann steht dort*. Pilze lassen sich nur schieben, nicht ziehen.
Beispiel: Bis zum Baum laufen
Im Editor öffnen ↗world("""
#########
#@ . . #
#########
""")
while not treeFront():
if onBerry():
removeBerry()
move()
Beispiel: Sokoban: Pilz auf die Beere
Im Editor öffnen ↗world("""
#######
#@ $ .#
#######
""")
while not mushroomFront():
move()
move()
move()
print("Geschafft: Der Pilz liegt auf der Beere.")
Spiele mit Pygame Zero #
Ein Spiel beginnt mit import pgzrun und endet mit pgzrun.go(). Dazwischen legst du die Größe fest und schreibst Funktionen, die das Spiel von selbst aufruft: draw() zeichnet, update() bewegt (etwa 60-mal pro Sekunde). Auf dem Handy erscheinen Pfeil- und Sprungknöpfe unter dem Spiel.
Grundgerüst
WIDTH = 800Breite des Spielfelds in Pixeln, HEIGHT die Höhe, TITLE der Titel.def draw():Zeichnet das Bild neu. Meist zuerst screen.clear() oder ein Hintergrund.def update():Bewegt alles ein kleines Stück, etwa 60-mal pro Sekunde.def on_key_down(key):Wird einmal pro Tastendruck aufgerufen: if key == keys.SPACE:.def on_mouse_down(pos):Klick oder Tipp; pos ist (x, y). Dazu on_mouse_up(pos) und on_mouse_move(pos).pgzrun.go()Startet das Spiel. Muss die letzte Zeile sein.Figuren (Actor)
figur = Actor("ente", (x, y))Eine Figur mit einem Bild aus der Bildbibliothek; die Position ist ihre Mitte.figur.x, figur.yPosition der Mitte; ändern bewegt die Figur. Auch figur.pos = (x, y).figur.draw()Zeichnet die Figur (in draw()).figur.image = "ente_links"Wechselt das Bild, z. B. für eine Animation.figur.angleDrehung in Grad gegen den Uhrzeigersinn.figur.colliderect(andere)Berühren sich zwei Figuren?figur.collidepoint(pos)Liegt der Punkt (z. B. ein Klick) auf der Figur?figur.left, .right, .top, .bottomRänder der Figur, praktisch für den Spielfeldrand.figur.distance_to(andere)Abstand in Pixeln; figur.move_towards(ziel, 3) geht ein Stück hin.Zeichnen (screen)
screen.clear()Macht alles schwarz.screen.fill("skyblue")Füllt mit einer Farbe (Name oder (r, g, b)).screen.blit("pf_bg_day", (0, 0))Zeichnet ein Bild mit der linken oberen Ecke an (x, y), z. B. einen Hintergrund.screen.draw.text("Hallo", (10, 10))Schreibt Text, z. B. mit fontsize=40, color="white".screen.draw.filled_circle((x, y), r, "red")Gefüllter Kreis; screen.draw.circle nur der Rand.screen.draw.filled_rect(Rect(x, y, b, h), "blue")Gefülltes Rechteck; screen.draw.rect nur der Rand.screen.draw.line((x1, y1), (x2, y2), "white")Eine Linie.Tastatur, Zeit, Klänge
keyboard.leftWird die Taste gerade gedrückt? Auch keyboard.right, keyboard.up, keyboard.space, keyboard.a …keys.SPACETastennamen für on_key_down(key): keys.LEFT, keys.RETURN, keys.A …clock.schedule_interval(funktion, sekunden)Ruft die Funktion immer wieder auf; clock.schedule(funktion, 2) einmal nach 2 Sekunden.animate(figur, pos=(x, y), duration=1)Bewegt eine Figur weich zum Ziel.sounds.coin.play()Spielt einen Klang aus der Bibliothek: coin, jump, hit, laser, explosion, win, platsch …tone.play("C4", 0.5)Spielt einen Ton (Note, Dauer in Sekunden).- Ton gibt es erst nach dem ersten Klick oder Tastendruck – so wollen es die Browser.
Beispiel: Ente mit Pfeiltasten
Im Editor öffnen ↗import pgzrun
WIDTH = 480
HEIGHT = 320
ente = Actor("ente", (240, 160))
def draw():
screen.fill("lightblue")
ente.draw()
def update():
if keyboard.left:
ente.x = ente.x - 4
if keyboard.right:
ente.x = ente.x + 4
pgzrun.go()
Beispiel: Münze anklicken
Im Editor öffnen ↗import pgzrun
import random
WIDTH = 480
HEIGHT = 320
punkte = 0
muenze = Actor("pf_coin_1", (240, 160))
def draw():
screen.fill("darkgreen")
muenze.draw()
screen.draw.text("Punkte: " + str(punkte), (10, 10), fontsize=32)
def on_mouse_down(pos):
global punkte
if muenze.collidepoint(pos):
punkte = punkte + 1
sounds.coin.play()
muenze.pos = (random.randint(30, 450), random.randint(30, 290))
pgzrun.go()
Bildbibliothek #
Rund 600 Bilder und 14 Klänge findet jedes Spiel nur über ihren Namen – hochladen musst du nichts. Alle Bilder mit Suche, Vorschau und fertigem Code zeigt die Galerie.Zur Bildergalerie →
Bilder benutzen
Actor("ente")Ein Bild als Spielfigur. Die Bilder aus dem Buch heißen deutsch: ente, kueken, boot.images.heroine_run_1Ein Bild als Objekt, z. B. für screen.blit(images.pf_grass_mid, (0, 400))."heroine_run_" + str(i)Bilder einer Animation heißen ding_aktion_1, ding_aktion_2 … Nacheinander gezeigt, laufen sie.pf_ sp_ sea_ nat_ an_ ui_Der Anfang verrät das Paket: Jump’n’Run, Weltraum, Meer, Natur, Tiere, Spieloberfläche.images/ente.pngIm Expertenmodus gewinnt eine eigene Datei im Ordner images/ gegen das gleichnamige Bild der Bibliothek.Beispiel: Laufende Heldin (Animation)
Im Editor öffnen ↗import pgzrun
WIDTH = 480
HEIGHT = 320
LAUFEN = ["heroine_run_" + str(i) for i in range(1, 9)]
heldin = Actor(LAUFEN[0], (240, 200))
zeit = 0
def draw():
screen.blit("pf_bg_day", (0, 0))
heldin.draw()
def update():
global zeit
zeit = zeit + 1
heldin.image = LAUFEN[zeit // 4 % 8]
pgzrun.go()
Fenster mit guizero #
Mit guizero baust du Fenster mit Texten, Eingabefeldern und Knöpfen. Ein Knopf ruft über command= eine Funktion auf. Am Ende steht immer app.display().
Fenster und Elemente
app = App(title="Mein Fenster")Das Hauptfenster; auch width=, height=, bg=, layout="grid".Text(app, text="Hallo")Ein Text; size=, color=, font=. Ändern mit anzeige.value = "Neu".TextBox(app)Eingabefeld; der eingegebene Text steht in feld.value.PushButton(app, text="OK", command=funktion)Ein Knopf, der die Funktion aufruft (ohne Klammern dahinter!).CheckBox(app, text="Ja")Ankreuzfeld, kasten.value ist 1 oder 0.Combo(app, options=["a", "b"])Auswahlliste; die Wahl steht in .value.Slider(app, start=0, end=100)Schieberegler mit Zahl in .value.ListBox(app, items=[…])Liste zum Auswählen.Box(app, layout="grid")Gruppiert Elemente, z. B. Knöpfe nebeneinander (align="left") oder im Gitter (grid=[spalte, zeile]).Picture(app, image="bild.png")Zeigt ein Bild aus dem Projekt.Drawing(app)Zeichenfläche: .rectangle(), .oval(), .line(), .text().Waffle(app)Gitter aus farbigen Feldern, gut für kleine Spiele.Window(app)Ein zweites Fenster; .show() und .hide().Ablauf
app.display()Zeigt das Fenster und wartet auf Klicks. Muss am Ende stehen.app.repeat(1000, funktion)Ruft die Funktion jede Sekunde auf (Uhr, Spiel); app.after(ms, funktion) einmal.app.info("Titel", "Text")Hinweisfenster; app.yesno(…) fragt Ja/Nein, app.question(…) nach Text.element.when_clicked = funktionReagiert auf Klicks auf jedes Element; funktion(event) bekommt event.x, event.y.Formular-Designer
Code | EntwurfSteht guizero im Programm, erscheint über dem Codefeld „Code | Entwurf“. Im Entwurf ziehst du Elemente ins Fenster und änderst ihre Eigenschaften – der Code schreibt sich mit.Doppelklick auf einen KnopfLegt die Funktion für command= im Code an und springt dorthin. „← Zurück zum Entwurf“ führt zurück.TestenStartet das Fenster im Entwurf so, wie es beim Ausführen aussieht.Beispiel: Begrüßung
Im Editor öffnen ↗from guizero import App, Text, TextBox, PushButton
app = App(title="Begrüßung", width=300, height=180)
name = TextBox(app)
antwort = Text(app, text="")
def gruessen():
antwort.value = "Hallo " + name.value + "!"
PushButton(app, text="Begrüßen", command=gruessen)
app.display()
Beispiel: Sekundenzähler
Im Editor öffnen ↗from guizero import App, Text
app = App(title="Uhr", width=240, height=140)
anzeige = Text(app, text="0", size=40)
def weiter():
anzeige.value = int(anzeige.value) + 1
app.repeat(1000, weiter)
app.display()
Rechnen mit numpy #
numpy rechnet mit ganzen Zahlenreihen (Arrays) auf einmal: a * 2 verdoppelt jede Zahl. Natter bringt die wichtigsten Teile mit.
Arrays
np.array([1, 2, 3])Array aus einer Liste.np.arange(0, 10, 2)Zahlen von 0 bis unter 10 in Zweierschritten.np.linspace(0, 1, 5)5 gleichmäßig verteilte Zahlen von 0 bis 1 – gut für Funktionsgraphen.np.zeros(5)Array aus Nullen; np.ones(5) aus Einsen.a + b, a * 2, a ** 2Rechnen mit jedem Element auf einmal.a[a > 2]Nur die Elemente, die die Bedingung erfüllen.a.shapeForm des Arrays, z. B. (3,) oder (2, 3); a.reshape(2, 3) ändert sie.Auswerten
a.sum()Summe; auch a.mean() (Mittelwert), a.min(), a.max(), a.std().np.median(a)Median (Zentralwert).np.sqrt(a)Wurzel jedes Elements; auch np.sin, np.cos, np.exp, np.log.np.piDie Kreiszahl π.np.random.randint(1, 7, 100)100 Zufallszahlen von 1 bis 6 (die 7 ist nicht dabei).np.unique(a, return_counts=True)Verschiedene Werte und wie oft sie vorkommen.Beispiel: Notendurchschnitt
Im Editor öffnen ↗import numpy as np
noten = np.array([2, 3, 1, 4, 2, 2, 3])
print("Durchschnitt:", noten.mean())
print("Beste Note:", noten.min())
print("Besser als 3:", noten[noten < 3])
Diagramme mit matplotlib #
Mit matplotlib.pyplot zeichnest du Diagramme. plt.show() zeigt sie neben dem Code; unter jedem Diagramm gibt es Knöpfe zum Herunterladen als SVG oder PNG.
Diagrammarten
plt.plot(x, y)Liniendiagramm; "r--" macht eine rote gestrichelte Linie, label="…" für die Legende.plt.scatter(x, y)Punktwolke.plt.bar(namen, werte)Säulendiagramm; plt.barh liegt quer.plt.hist(werte, bins=10)Histogramm: Wie oft liegen Werte in jedem Bereich?plt.pie(werte, labels=namen)Kreisdiagramm, autopct="%1.0f%%" zeigt Prozente.Beschriften und zeigen
plt.title("Titel")Überschrift.plt.xlabel("x")Beschriftung der x-Achse, plt.ylabel der y-Achse.plt.legend()Legende aus den label=-Angaben.plt.grid(True)Gitterlinien.plt.show()Zeigt das Diagramm.plt.savefig("bild.png")Speichert das Diagramm als Datei zum Herunterladen.fig, ax = plt.subplots()Für mehrere Diagramme nebeneinander: plt.subplots(1, 2).Beispiel: Parabel zeichnen
Im Editor öffnen ↗import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-3, 3, 50)
plt.plot(x, x ** 2, label="x²")
plt.plot(x, 2 * x + 1, "r--", label="2x + 1")
plt.title("Zwei Funktionen")
plt.legend()
plt.grid(True)
plt.show()
Beispiel: Säulen: Lieblingsfächer
Im Editor öffnen ↗import matplotlib.pyplot as plt
faecher = ["Mathe", "Sport", "Kunst", "Info"]
stimmen = [5, 9, 4, 8]
plt.bar(faecher, stimmen, color="seagreen")
plt.title("Lieblingsfach der 7b")
plt.ylabel("Stimmen")
plt.show()
Daten aus dem Internet (requests) #
Mit requests holt dein Programm Daten von einem Server, oft im Format JSON. Das Programm wartet, bis die Antwort da ist.
Anfragen
r = requests.get(adresse)Holt die Seite oder die Daten unter der Adresse. params={"q": "wert"} hängt Angaben an.r.status_code200 heißt: alles gut. 404: gibt es nicht.r.json()Wandelt eine JSON-Antwort in Listen und Wörterbücher um.r.textDie Antwort als Text.requests.post(adresse, json=daten)Schickt Daten an einen Server.- CORS: Im Browser darf eine Webseite nur Antworten von Servern lesen, die das ausdrücklich erlauben. Viele offene Datenquellen (Wetter, Wikipedia-API, GitHub-API) tun das, normale Webseiten meist nicht. Dann meldet das Programm einen
ConnectionErrormit dem Hinweis auf CORS – das ist keine Schuld deines Programms. Nimm eine andere Quelle oder führe das Programm auf deinem eigenen Rechner aus.
Beispiel: Wetter in Berlin
Im Editor öffnen ↗import requests
r = requests.get("https://api.open-meteo.com/v1/forecast",
params={"latitude": 52.52, "longitude": 13.41, "current": "temperature_2m"})
daten = r.json()
print("Jetzt in Berlin:", daten["current"]["temperature_2m"], "°C")
Dateien und Projekte #
Programme können Textdateien schreiben und lesen. In der einfachen Stufe gibt es sie nur, solange das Programm läuft. Im Expertenmodus landen sie im Projekt und bleiben gespeichert.
Schreiben und lesen
open("datei.txt", "w")Öffnet zum Schreiben ("w" ersetzt, "a" hängt an, "r" liest). Am besten mit with open(…) as f: – dann wird die Datei sicher geschlossen.f.write("Text\n")Schreibt Text; \n beginnt eine neue Zeile.f.read()Liest die ganze Datei als Text.for zeile in f:Liest Zeile für Zeile; zeile.strip() entfernt den Zeilenumbruch.os.listdir()Namen der Dateien im Projekt; os.path.exists("datei.txt") prüft, ob es sie gibt.json.dump(daten, f)Speichert Listen und Wörterbücher; json.load(f) liest sie wieder.Projekte (Expertenmodus)
import hilfenHolt die eigene Datei hilfen.py aus dem Projekt; danach hilfen.funktion(). Auch Ordner als Pakete (from spiel import figuren).SpeichernProjekte liegen im Browser und werden automatisch gespeichert. In Chrome und Edge am Rechner kannst du einen Ordner öffnen; sonst gibt es Export und Import als ZIP.Einfach | ExperteDer Umschalter oben rechts nimmt deinen Code in beide Richtungen mit.Beispiel: Datei schreiben und lesen
Im Editor öffnen ↗with open("notizen.txt", "w") as f:
f.write("Montag: Python gelernt\n")
f.write("Dienstag: Spiel gebaut\n")
with open("notizen.txt") as f:
for zeile in f:
print(zeile.strip())