Turtle-Grafik mit Python 3.1 – Einführung Hardware und Software Hardware: Alle Computer bestehen aus folgenden Grundbausteinen: Eingabegeräte (Tastatur, Maus, Scanner, Joystick, .....) Zentraleinheit ( Rechenwerk, Steuerwerk, Arbeitsspeicher, ...) Ausgabegeräte (Monitor, Drucker, Interface, ....) Neben dem Hauptspeicher der Zentraleinheit (Arbeitsspeicher) benötigt man Speicher, mit deren Hilfe man Informationen (Daten) sichern kann: USB-Stick mit USB-Port Festplatte mit Festplattenlaufwerk Diskette mit Diskettenlaufwerk CDs mit CD-ROM-Laufwerk und viele mehr Man unterscheidet 2 Arten von Speichern: Nur-Lese-Speicher : ROM (Read Only Memory) z. B. für das Steuerprogramm des Computers, CDs. Der Speicherinhalt lässt sich nicht verändern Schreib-Lese-Speicher : RAM (Random Access Memory) Hauptspeicher, Disketten, USB-Stick, Festplatte. Daten können gelöscht und geändert werden. Software: Was bisher beschrieben wurde, sind die Geräte, die so genannte Hardware. Mit der Hardware eines Computers alleine kann man nichts anfangen. Damit ein Computer arbeiten kann, benötigt man Software. Software ist das Programm, die Arbeitsmethode. Anwenderprogramme (z. B. Textverarbeitungsprogramme) sind Programme, die der Benutzer für festgelegte Aufgaben benutzen kann (Schreiben, Zeichnen, Spiele, ...). Wenn du den Computer für eigene Aufgaben (Lernprogramme, Berechnungen, Spiele, ..) benutzen willst, brauchst du eine Programmiersprache, die diese Aufgaben dem Computer verständlich macht. Computer verstehen nur diese eigens für sie geschaffenen Computersprachen. Es gibt zahlreiche Programmiersprachen: Python, Delphi, Comal, Logo, BASIC, C, C++, Java, PHP und viele mehr. In diesem Kurs benutzt du die Programmiersprache Python 3.1. Du kannst dir Python 3.1 kostenlos im Internet herunterladen, um auch zu Hause weiter zu programmieren: http://www.python.org Im Internet findest du auch zahlreiche Hilfen und Anleitungen. Beim Programmieren erfährst du, dass der Computer ein „nimmermüdes Arbeitstier" ist und bekommst eine Vorstellung, wie Computerprogramme entstehen. Dierk Schröder, 19.01.2011 1 Turtle-Grafik mit Python 3.1 – Einführung Mit deinen Programmen kannst du Bilder erstellen, Berechnungen durchführen, Texte bearbeiten lassen, Quizübungen durchführen, Spiele spielen u..v. m. Zeichnen mit Turtle-Grafik Die „Turtle“ ist eine programmierbare „Schildkröte“, die auf dem Boden hin- und herlaufen kann und, falls der Zeichenstift abgesenkt ist, ihren zurückgelegten Weg aufzeichnet. Starte Python, damit es losgehen kann. IPI – Interaktiver Python Interpreter: Du kannst sofort loslegen, wenn du in der Eingabezeile deine Befehle eingibst. Du gibst ein – Python gibt aus. Damit du Turtle-Befehle benutzen kannst, musst du zuerst das Modul Turtle importieren. >>> from turtle import * >>> mode("logo") # es werden alle Turtle-Methoden geladen # 0° -> Nord, 90° -> Ost, rechtsdrehend Es passiert zunächst scheinbar nichts. Ab jetzt kannst du im interaktiven Modus (IPI) die verfügbaren Turtle-Befehle ausprobieren und sofort das Ergebnis des Befehls beobachten. Alle was hinter # steht, ist ein Kommentar und wird vom Programm nicht beachtet. >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> forward(200) # right(90) # forward(100) # right(90) # fd(200) # rt(90) # fd(100) # rt(90) # left(45) # back(50) # pu() # pd(-50,100) # down() # forward(200) # circle(50) # pu() # fd(50) # down() # circle(50,90) # lt(180) # circle(50,90) # pd() home() # pd() setheading(90) # gehe 200 Pixel vor drehe dich um 90° nach rechts gehe 100 Pixel vor drehe dich um 90° nach rechts gehe 200 Pixel vor drehe dich um 90° nach rechts gehe 100 Pixel vor drehe dich um 90° nach rechts drehe dich um 90° nach links gehe 50 Pixel zurück hebe den Stift an gehe zum Punkt (-50,100) senke den Stift ab gehe 200 Pixel vor zeichne einen Kreis mt dem Radius 50 Pixel hebe den Stift an gehe 50 Pixel vor senke den Stift ab zeichnet einen Bogen mit r=50 Pixel und Winkel=90° drehe dich um 180° nach links zeichnet einen Bogen mit r=50 Pixel und Winkel=90° die Turtle springt in die Bildmitte (0|0) die Turtle-Richtung wird auf 90° gesetzt. IDLE – Befehle im Editor-Fenster eingeben: Wähle File-New Window Dierk Schröder, 19.01.2011 2 Turtle-Grafik mit Python 3.1 – Einführung Jetzt kannst du die Befehle in einzelne Zeilen schreiben. Du erhältst dann eine Programmliste. Diese Liste kannst du beliebig verändern, und damit das Ausgbebild nach deinen Wünschen gestalten. Aber achte unbedingt auf die richtige Rechtschreibung (Syntax). Python verzeiht keine Schreibfehler. Die Fehlermeldungen kommen erst, wenn du das Programm startest. Beginne dein erstes Programm mit folgenden Zeilen: from turtle import * mode('logo') reset() shape('turtle') color('darkgreen') width(2) ….. ….. ….. # # # # # Turtle zeigt bei 0° nach oben wie in Comal Turtle wird in den Anfangszustand versetzt statt des Dreiecks wird eine Turtle angezeigt die Zeichenfarbe wird auf dunkelgrün gesetzt die Linienbreite beträgt 2 Pixel hier folgen jetzt die Befehle, die du schon oben ausprobiert hast. Du kannst die Befehlsliste beliebig verlängern und verändern, bis du mit deinem Bild zufrieden bist. Achtung! Dies muss die letzte Zeile deines Programms sein: mainloop() Mit File-Save As kannst du dein Programm speichern. Wähle für die Dateinamen immer die Dateiendung .py! Mit File-Open kannst du gespeicherte Programme öffnen und später weiter bearbeiten. Es gibt noch Methoden, mit denen du den Grafik-Bildschirm beeinflussen kannst: clear() reset() bye() # die Zeichnung der aktiven Turtle wird gelöscht # die Turtle wird in den Anfangszustand versetzt # das Turtlefenster wird geschlossen Mit den bisherigen Befehlen kannst du schon sehr schöne Bilder erzeugen. Es fehlt aber noch eine Methode, um Flächen auszufüllen: color(red) fillcolor('yellow') begin_fill fd(100) rt(90) fd(100) rt(90) fd(100) rt(90) fd(100) rt(90) end_fill # setzt Zeichenfarbe auf rot # setzt die Füllfarbe auf gelb # hier beginnt das auszufüllende Viereck # hier wird das geschlossene Viereck gefüllt Wenn du dir die Zeichenschritte auf dem Grafikbildschirm in Ruhe ansehen willst, kannst du das Zeichnen verlangsamen. Dierk Schröder, 19.01.2011 3 Turtle-Grafik mit Python 3.1 – Einführung speed(5) delay(5) tracer(1) tracer(0) # # # # 0:am Schnellsten, 10: schnell, 1: langsam Verzögerung in Millisekunden (0: schnell) schaltet Animation ein schaltet Animation aus Relative Befehle: Die Befehle forward(x), backward(x), left(x), right(x), circle(r), circle(r,w) bezeichnet man als relative Befehle, weil der Zeichenstift immer vom letzten Standort weiter zeichnet. Absolute Befehle: Die Befehle setheading(w) und goto(x,y) bezeichnet man als absolute Befehle, weil der Zeichenstift unabhängig vom letzten Standort bewegt wird. Bitte beachte: Dezimalbrüche (Kommazahlen) musst du immer mit Dezimalpunkt schreiben! Beispiel: nicht 4,7 sondern 4.7 Wiederholungen Du hast oben ein Quadrat programmiert und festgestellt, dass du viermal die folgenden Befehle geschrieben hast: fd(100) rt(90) Das gleiche Ergebnis erhältst du mit einer Schleife (Wiederholung). for i in range(4): # Beginn der Wiederholung. : nicht vergessen! fd(100) # wird viermal wiederholt rt(90) # wird viermal wiederholt write('Die Wiederholung ist beendet') Der Befehlsblock, der viermal wiederholt werden soll muss mit dem Tabulator gleichmäßig eingerückt werden. range(4) ist eine Liste aus 4 Zahlen [0, 1, 2, 3]. Wenn die Liste durchlaufen wurde, ist die Wiederholung beendet und der nächste Befehl wird ausgeführt. i ist eine Variable, die den jeweiligen Listenwert von 0 bis 3 annimmt for z in range(8): fd(100) rt(45) print(z) # # # # Beginn der Wiederholung. : nicht vergessen! wird achtmal wiederholt wird achtmal wiederholt der Wert von z wird geschrieben So geht’s auch: Dierk Schröder, 19.01.2011 4 Turtle-Grafik mit Python 3.1 – Einführung a = 1 # die Variable a erhält den Wert 1 while a<20: # wiederhole solange wie a kleiner als 20 ist fd(a*5) # gehe 5*a Pixel vorwärts rt(90) a = a+1 # a wird um 1 vergrößert write('Die letzte Zahl war: '+str(a)) Der Benutzer kann auch selber bestimmen, wie oft wiederholt werden soll. ecken=textinput('Vieleck','Wie viele Ecken?') # nur Ziffern eingeben laenge=textinput('Eingabe','Seitenlänge?') # nur Ziffern eingeben anzahl=int(ecken) # Umwandlung Text in ganze Zahl s=int(laenge) # Umwandlung Text in ganze Zahl (integer) begin_fill() for z in range(anzahl): fd(s) rt(360/anzahl) write(z) fillcolor('yellow') end_fill() name=textinput('Polygon','Wie heißt das Vieleck?') rt(90) pu() fd(s) write(name) home() pd() Neue Befehle erfinden Wenn du das Quadrat mit einem einzigen Befehl zeichnen möchtest kannst du die Methode selber definieren. Python lernt einen neuen Befehl quadrat(), den du wie alle anderen Python-Befehle innerhalb des Programms benutzen kannst. Denke unbedingt an die (leere) Klammer und die Doppelpunkte, sonst funktioniert es nicht. def quadrat(): for i in range(4): fd(100) rt(90) Mit dem folgenden Befehl wird diese Methode ausgeführt: quadrat() Noch besser geht es so: def quadrat(a): for i in range(4): fd(a) rt(90) Mit dem Befehl quadrat(50) wird ein Quadrat mit 50 Pixel Seitenlänge gezeichnet. Dierk Schröder, 19.01.2011 5 Turtle-Grafik mit Python 3.1 – Einführung Hier siehst du, wie man den Befehl quadrat(s) einsetzen kann. def muster(): for i in range(1, 10): quadrat(i*10) range(1,10) erzeugt die Liste [1, 2, 3, …, 9] mit 9 Zahlen. Die Seitenlänge des Quadrats wird in jeder Runde verzehnfacht. (10, 20, 30, …;90) Python kann auch würfeln Wenn du Zufallszahlen erzeugen willst benötigst du die Befehlserweiterung random: from random import * # es werden alle Zufalls-Methoden geladen for i in range(20): x=randint(1,2) y=randint(3,4) print('x=',x,sep='',end=' ') print('y=',y,sep='') Ein gut strukturiertes Programm besteht im Wesentlichen aus einzelnen Methodendefinitionen die bestimmte Teilaufgaben erledigen und überall im Programm zur Verfügung stehen. Der Aufruf einer neuen Methode def …(): muss unterhalb der Methodendefinition stehen. Turtle-Befehle Bewegung und Zeichnen forward(40), fd(40) die Turtle zeichnet 40 Pixel vorwärts back(30), bk(30) die Turtle bewegt sich rückwärts und zeichnet right(90), rt(90) dreht die Turtle um 90° weiter nach rechts left(60), lt(60) dreht die Turtle um 60° weiter nach links circle(30) zeichnet einen Kreisbogen links mit dem Radius 30 Pixel circle(20,90) zeichnet einen Kreisbogen nach links mit einem Radius von 20 Pixel und einem Winkel von 90° write('Hallo Welt', font=('Arial', 16)) Schreibt Hallo Welt in Schriftart Arial und Schriftgröße 16 an der aktuellen Position dot(3,’red’) zeichnet einen Punkt mit dem Durchmesser 3 Pixel und der Farbe rot an der aktuellen Position goto(100,200), setpos(100,200) setzt die Turtle auf den Punkt (100|200) und zeichnet setheading(270), seth(270) dreht die Turtle auf 270° (West), unabhängig von dem vorher eingestellten Winkel. pu(), up() der Zeichenstift wird hochgenommen. (die Turtle bewegt sich danach ohne zu zeichnen) pd(), down() der Zeichenstift wird heruntergesetzt. Die Turtle zeichnet wieder. Dierk Schröder, 19.01.2011 6 Turtle-Grafik mit Python 3.1 – Einführung hideturtle(), ht() Turtle wird unsichtbar showturtle(), st() Turtle wird sichtbar s1=stamp() stempelt den Umriss der Turtle an der aktuellen Position. Stempelname ist s1 clearstamp(s1) löscht Stempel s1 clearstams(n) lösche alle, die ersten, die letzten von n Stempeln. Wenn die Klammer leer ist, werden alle gelöscht. Wenn n > 0 werden die ersten n Stempel, sonst die letzten n Stempel gelöscht Position und Winkel bestimmen position(), pos() gibt die (x|y)-Koordinaten der Turtle zurück towards(x,y) gibt den Abstand bis zum Punkt (x|y) zurück xcor() gibt die x-Koordinate der Turtle zurück ycor() gibt die y-Koordinate der Turtle zurück heading() gibt den Winkel der Turtle zurück distance(x,y) gibt den Abstand der Turtle zum Punkt (x|y) zurück Farben, Füllung, Aussehen width(3), pensize(3) setzt Linienbreite auf 3 Pixel color('red','yellow') die Zeichenfarbe ist rot, die Hintergrundfarbe ist gelb fillcolor('blue') die Hintergrundfarbe wird auf blau gesetzt. begin_fill färbt folgende geschlossene Fläche mit aktueller Hintergrundfarbe aus. end_fill färbt vorher geschlossene Fläche mit angegebener Farbe. bgcolor('pink') die Hintergrundfarbe wird auf pink gesetzt bgpic('dateipfad') es wird ein Bild als Hintergrund geladen shape('turtle') legt das Aussehen der Turtle fest ('arrow', 'turtle', 'circle', 'square', 'triangle', 'classic'). Grafikbilschirm setworldcoordinates (-10,-10,10,10) legt das Koordinatensystem der Zeichenfläche auf die entsprechenden Koordinaten fest. (Gibt u. a. Probleme mit circle(20,90)) title("Willkommen im Turtlezirkus!") Titelzeile im Grafikfenster setup(width=200, height=200, startx=0, starty=0) Das Grafikfenster wird auf die angegebenen Werte eingestellt. bye() schließt das Grafikfenster clear() löscht die Zeichnung der Turtle z. B. paula.clear() clearscreen() löscht den Grafikbildschirm Dierk Schröder, 19.01.2011 7 Turtle-Grafik mit Python 3.1 – Einführung Aktionen mit Maus und Tasten listen() setzt den Focus auf das Fenster, um auf Maus und Tastatur zu reagieren. onkey(funk,'T') funk wird ausgeführt wenn Taste 'T' gedrückt wird onkeyrelease(funk,'T') funk wird ausgeführt wenn Taste 'T' losgelassen wird onkeypress(funk,['T']) funk wird ausgeführt solange (irgendeine) Taste gedrückt wird onscreenclick(funk) funk wird ausgeführt, wenn der Bildschirm angeklickt wird onclick(test) beim Klicken auf die Turtle wird test(x|y) mit den Mauskoordinaten (x|y) ausgeführt. Die aufgerufene Prozedur muss so aussehen def test(x,y): onrelease(test2) test2(x|y) wird beim Loslassen mit den Mauskoordinaten (x|y) ausgeführt. def test2(x|y): ondrag(test3) test3(x|y) wird beim Ziehen mit den Mauskoordinaten (x|y) ausgeführt. def test3(x|y): auch: ondrag(goto) Variable und Co. a=2 weist der Variablen a den Wert 2 zu. fd(3*a) zeichnet eine Linie mit 6 Einheiten, wenn a gleich 2 ist a+=3 oder a-=3 vergrößert (verkleinert) den Wert der Variablen a um 3. Wenn a gleich 2 ist, dann wird a=5 bzw. a=-1) x=a**3 weist der Variablen x den Wert a³ zu. Wenn a=2 dann ist x=8 z=randint(1,6) vorher das Modul random importieren: from random import * z bekommt als Wert eine Zufallszahl zwischen 1 und 6 (würfeln) y:=3x+2 es können beliebige Formeln als Zuweisung gewählt werden zahl_str = textinput('Gib eine Zahl ein:') Du kannst in einem Dialog einen beliebigen Text eingeben. kommazahl = float(zahl_str) Wenn der Text aus Ziffern besteht, wird der Text in eine Kommazahl (float) umgewandelt. zahl = int(zahl_str) Wenn der Text aus Ziffern besteht, wird der Text in eine ganze Zahl (integer) umgewandelt. Du benötigst schnell alle Informationen zu einem Befehl? Gib an der Eingabeauforderung help(Befehl) ein: >>> >>> >>> >>> >>> >>> from turtle import * help(shape) help(bgcolor) help (mode) help(bgpic) help(Turtle) Fehlerbehandlung Dierk Schröder, 19.01.2011 8 Turtle-Grafik mit Python 3.1 – Einführung Trotz sorgfältiger Programmierung kann es zu so genannten Laufzeitfehlern kommen. Wenn vom Benutzer z. B. eine ganze Zahl eingegeben werden soll und eine Kommazahl (float) oder ein Text (string) eingegeben wird. zahl = numinput('Eingabe','Gib eine ganze Zahl ein:',5,1,10) try: speed(zahl) # wenn hier abgebrochen wird … except: speed(5) # … geht's hier weiter Lust auf ein Spiel? Du kannst den Quelltext im Internet herunterladen: http://igs-hassee.lernnetz.de/Silverstripe/Informatik (CatchMe.py) # Catch me if you can! Paula fängt Horst, du fängst Paula. from turtle import * from random import * mode('logo') level = numinput("Fang' Paula!",'Wähle Level (1-10):',5,1,10) try: delay(10-int(level)) except: delay(5) pu() goto(300,-250) rt(45) pd() begin_fill() fillcolor('pink') circle(400,360,4) end_fill() color('black','green') pu() goto(-50,300) pd() write('Catch me if you can! Paula fängt Horst, du fängst Paula') ht() pd() def main(x,y): # x|y ist nötig, um Mauskoordinaten zu paula = Turtle() # übergeben paula.shape('turtle') paula.color('red','yellow') paula.pu() paula.goto(-250,290) paula.pd() horst = Turtle() horst.shape("turtle") horst.reset() Dierk Schröder, 19.01.2011 9 Turtle-Grafik mit Python 3.1 – Einführung horst.pu() horst.goto(180,290) horst.pd() horst.color("black","darkgreen") paula.seth(towards(horst)) horst.seth(randint(180,270)) horst.stamp() paula.stamp() count = 1 geschafft=False def start(mx,my): paula.clear() main(1,2) # mx|my für Mauskoordinaten def gefangen(mx,my): if not geschafft: paula.write('Super, du hast Paula erwischt!') else: paula.write('Das zählt ja wohl nicht?!') onclick(start) # Mauskoordinaten werden paula.onclick(gefangen) # automatisch übergeben while paula.distance(horst) > 4: horst.fd(randint(3,7)) horst.lt(randint(-20,40)/10) paula.setheading(paula.towards(horst)) paula.fd(randint(1,10)) if count % 20 == 0: horst.stamp() paula.stamp() count += 1 if horst.ycor()<-260 or horst.xcor()>310: horst.write('Puh, geschafft!') paula.write('Mist, entwischt!') geschafft=True break if not geschafft: horst.write("Erwischt!",font=("Arial",14,"bold")") pu() goto(-200,-200) shape('circle') write(' Noch einmal? Hier klicken') pd() st() #****** end_main ********* main(1,2) # 1 und 2 sind "Dummyzahlen" mainloop() Dir fällt sicher noch eine Menge ein, um dieses Spiel zu erweitern. Dierk Schröder, 19.01.2011 10 Turtle-Grafik mit Python 3.1 – Einführung Programmbeispiele I Deine Bildschirmausgabe kann von den Beispielbildern abweichen, weil dort andere Koordinaten eingestellt sind. #Quadratmuster from turtle import * mode('logo') x=-150 y=-150 for i in range(5): pu() goto(x,y) pd() for i in range(4): fd(20) rt(90) x+=30 y+=30 mainloop() # Methoden from turtle import * from random import * mode('logo') def schild(): fd(80) begin_fill rt(90) circle(20) lt(90) fillcolor('red') end_fill bk(80) def schildmuehle(): n=randint(4,20) for i in range(n): schild rt(360/n) schildmuehle() mainloop() Dierk Schröder, 19.01.2011 11 Turtle-Grafik mit Python 3.1 – Einführung Programme mit Wiederholungen Schreibe Programme, die folgende Bilder zeichnen: Dierk Schröder, 19.01.2011 12 Turtle-Grafik mit Python 3.1 – Einführung Programmbeispiele II Ändere die Befehlszeilen so um, dass die Prozeduren mit Python 3.1 funktionieren. löschen x:=0 y:=0 seite:=2 anzahl:=5 siedlung ht proc quadrat repeat(4) fd(Seite) rt(90) end endproc proc dreieck repeat(3) fd(seite) rt(120) end endproc proc baum pw(seite*10) pc(brown) fd(seite) pw(1) pc(green) lt(90) bogenr(seite/3,360) rt(90) pu fd(seite/3/2) fill(green) bk(seite/3/2) bk(seite) pd pc(darkblue) endproc Dierk Schröder, 19.01.2011 proc haus quadrat pu fd(seite) pd rt(30) dreieck lt(30) pu bk(seite) pd endproc proc Straße repeat(Anzahl) mt(x,y) haus pu lt(90) fd(seite/4) rt(90) pd baum lt(90) pu bk(seite/4) rt(90) pd x:=x+seite+seite/1.5 y:=y+seite+seite/2 end endproc proc Siedlung repeat(10) seite:=zufall(1,20)/10 anzahl:=1 straße end endproc 13 Turtle-Grafik mit Python 3.1 – Einführung Schreibe Prozeduren für die folgenden Bilder: Dierk Schröder, 19.01.2011 14 Turtle-Grafik mit Python 3.1 – Einführung Schreibe Programme für folgende Bilder: Dierk Schröder, 19.01.2011 15