K103: Eingabe in Turtle Graphics

Ziel

Programme benötigen in aller Regel Eingaben. Der User (Nutzer des Computers, Anwender) gibt dem Computer Informationen, welche dieser dann weiterverarbeitet. Beispielsweise ein Datum, einen Spielernamen, einen Text für einen Brief, u.v.m.

Am Ende dieses Themenblocks solltest du wissen,

  • wie man den Benutzer zur Eingabe einer Zahl über die Tastatur auffordern kann und den eingegebenen Wert dann speichert.
  • wie man den Benutzer zur Eingabe einer Zeichenfolge (Text) über die Tastatur auffordern kann und den eingegebenen Wert dann speichert.

Allgemeines zum Thema Eingaben

Eingaben, welche anschliessend von einem Programm verarbeitet werden, können über viele Wege erfolgen. Man kann Daten aus einer abgespeicherten Datenbank einlesen oder Daten von einem Sensor erhalten, beispielsweise über eine Mausbewegung. Die einfachste und auch ursprünglichste Form der Eingabe erfolgt jedoch über die Tastatur. Für diese Form der Eingabe haben wir im turtle Modul zwei Funktionen: numinput() und textinput(). Erstere nutzt man zur Eingabe von Zahlen, zweitere für Zeichenfolgen (Texte).

Kommt es in Python zum Aufruf dieser Funktionen, dann wird:

  • ein Eingabefenster (Eingabedialog) geöffnet. Dies ist ein zusätzliches Fenster, d.h. die Eingabe erfolgt nicht direkt in unserem Turtle Graphics Screen, in welchem wir «zeichnen».
  • der Programmablauf solange gestoppt, bis der Benutzer eine Eingabe über die Tastatur getätigt hat (d.h. diese mit der Return-Taste abschliesst oder einen der zwei Buttons «Ok» bzw. «Cancel» gedrückt hat).
  • Der eingegebene Wert an uns zurückgegeben.

Mit solchen Benutzerangaben können wir dann in unserem Programm weiterarbeiten, und so beispielsweise die Grösse eines Quadrats entsprechend dem Wunsch des Benutzers anpassen.

Hinweis für Fortgeschrittene:

Wenn du Python (ohne Turtle Graphics) lernst, dann wirst du als erstes die Eingabefunktion input() kennen lernen. Diese nutzte ein anderes Eingabefenster (andere Interaktionsschnittstelle). Die Eingabe des Benutzers erfolgt hier direkt in unserer Shell, welches ja quasi die Python Standard- Interaktionsschnittstelle zum Benutzer ist.

Eingabe von Zahlen mittels numinput()

Die Anweisung numinput() (von engl. «number»: «Zahl» & von engl. «input»: «Eingabe») öffnet einen grafischen Eingabedialog (ein kleines Fenster), in welchem der Benutzer eine Zahl eingeben kann. Die Anweisungen hat folgende Syntax:

turtle.numinput(title, prompt,
default=None, minval=None, maxval=None
)

Die Anweisung hat eine Reihe von Parametern. Zwingend anzugeben sind die ersten 2 Parameter title und prompt:

  • Der Parameter title definiert den Titel des Eingabefensters
  • prompt beschreibt, was einzugeben ist. Also einen Information/ Hilfstext für den Nutzer

Hierzu ein kleines Beispiel:

from turtle import *

a = numinput("Mein Titel", "Eine Zahl:")
forward(a)

exitonclick()

muss man in Variable ablegen, dann brauchen

Type ist float, auch wenn man eine Ganzzahl eingibt. Achtung Cancel

Der erste optionale Parameter heisst default:

  • default definiert einen Standard-Vorgabewert

Manchmal möchte man einen Wert vorgeben. Der Benutzer kann den Wert übernehmen (einfach «ok» drücken) oder bei Bedarf im Eingabedialog ändern.

from turtle import *

a = numinput("Mein Titel", "Eine Zahl:", 50)
forward(a)

exitonclick()

Schliesslich haben wir noch zwei weitere Parameter:

  • minval: minimaler erlaubter Eingabewert
  • maxval: maximaler erlaubter Eingabewert

Über dieses Parameter kann man also festlegen, in welchem Wertebereich die Zahl sein soll. So können wir beispielsweise sicherstellen, dass die eingegebene Zahl zwischen 0 und 200 ist.

from turtle import *

a = numinput("Mein Titel", "Eine Zahl:", 50, 0, 200)
forward(a)

exitonclick()

Gibt der Benutzer dann eine Zahl ausserhalb dieses Bereichs ein, so erscheint ein entsprechender Hinweis und der Benutzer wird aufgefordert, eine neue Zahl einzugeben.

Der Hinweistext ist in Englisch, das soll uns an dieser Stelle aber nicht weiter irritieren. Die numinput() Anweisung ist, hat man die Beispiele erst einmal gesehen, leicht verständlich. Bezüglich der Parameter gilt es dann aber einige Regeln zu beachten:

  • an erster Stelle kommen immer, zwingend, die zwei Parameter title und prompt. Ohne Angabe dieser kommt es zu einem sogenannten TypeError (TypeError: numinput() missing 2 required positional arguments: ‹title› and ‹prompt›)
  • Die anderen 3 Argumente sind optional. Man kann diese angeben, wenn man sie benötigt.
  • Gibt man für die optionalen Parameter Werte an, so ist die Reihenfolge genau einzuhalten. Ansonsten kann Python ja nicht wissen, welcher Wert zu welchem Parameter gehört. Python weiss, dass der dritte Parameter den default Value, der vierte Parameter den minval und der fünfte Parameter den maxval festlegt.
  • Möchte man die Reihenfolge nicht einhalten, so muss man zwingend die Parameter bezeichnen.
    numinput(«Mein Titel», «Eine Zahl:», maxval=200) legt beispielsweise nur die Obergrenze fest. Default Value und Untergrenze fehlen.


Löse jetzt die Aufgabe 1a-1d und 2a – 2b


Hinweis für Fortgeschrittene:

Der Rückgabewert der Funktion numinput() ist jeweils ein Objekt vom Typ float. Soll heissen, dass auch wenn der Benutzer eine Ganzzahl (Typ int) eingegeben hat, trotzdem ein float zurückgegeben wird. In aller Regel ist dies aber kein Problem, zumal auch die klassischen «Turtle»- Anweisungen wie forward(), right(), circle() etc. mit Gleitkommazahlen arbeiten.

Drückt der Benutzer den «Cancel» Button, so ist wird None (Typ None) zurückgegeben. Das kann, je nach Codeverlauf, zu Fehlern führen. In unserem oben dargestellten Beispiel wird so ein TypeError ausgelöst, da die Anweisung forward(None) nicht erlaubt ist. Man kann den Fehler abfangen und beispielsweise einfach einen Wert (und damit anderen Datentyp) festlegen.

a = numinput("Mein Titel", "Eine Zahl:", 50, 0, 200)
if a is None:
    a = 1
forward(a)

Zur Erläuterung siehe Aufgabe 2c


Hinweis: None ist ein Singelton Objekt. Man muss deshalb die Existenz mittels is prüfen)

Texteingabe mittels textinput()

Die Anweisung textinput() (von engl. «text»: «Text» & von engl. «input»: «Eingabe») öffnet einen grafischen Eingabedialog (ein kleines Fenster), in welchem der Benutzer eine Zeichenfolge (einen String) eingeben kann. Die Anweisungen hat folgende Syntax:

turtle.textinput(title, prompt)

Der Parameter title definiert den Titel des Fensters, prompt beschreibt, was einzugeben ist.

Übungsaufgaben

Nachfolgend findest Du ein paar Übungsaufgaben.


Aufgabe 1a: Ein einfaches Quadrat

Schreibe ein Programm, welches den Benutzer nach einer Seitenlänge fragt und anschliessend ein Quadrat in mit der gewünschten Seitenlänge zeichnet.

Der Eingabedialog (neues Fenster) soll den Fenstertitel «Parameter» und das Eingabefeld die Beschriftung «Seitenlänge» haben.

Aufgabe 1b: Ein einfaches Quadrat mit Vorgabewert

Ergänze das Programm aus Aufgabe 1a nun so, dass im Eingabedialog ein Wert von 100 vorgeschlagen wird.

Aufgabe 1c: Ein einfaches Quadrat mit Wertebereich

Ergänze das Programm aus Aufgabe 1b nun so, dass zusätzlich nur Eingaben innerhalb eines Wertebereichs von 10 bis 200 möglich sind. Soll heissen, dass unser Quadrat mindestens die Seitenlänge 10 und maximal die Seitenlänge 200 haben kann

Aufgabe 1d: Ein einfaches Quadrat Untergrenze

Neu soll, im Unterschied zur Aufgabe 1b und 1c, lediglich die Untergrenze festgelegt werden. Der Mindestwert (minimale Seitenlänge des Quadrats beträgt 10 Punkte.

Aufgabe 2a: Ein variables Rechteck

Schreibe ein Programm, welches den Benutzer nach den Seitenlängen eines Rechtecks fragt und anschliessend das Rechteck in der gewünschten Grösse zeichnet. Erstelle hierzu nacheinander 2 Eingabedialoge und lege die Eingaben in den Variablen breite und höhe ab.

Aufgabe 2b: Ein Rechteck mit Wertbereich

Passe das Programm aus Aufgabe 2a nun so an, dass für die Breite ein Wert von 100 und die Höhe ein Wert von 50 vorgeschlagen wird. Für die Breite sind Werte zwischen 5 und 200 zulässig. Für die Höhe Werte zwischen 5 und der eingegebenen Breite. Unser Rechteck kann also nicht höher wie breit sein.

Aufgabe 2c: Ein Rechteck – Cancel Button

Passe das Programm aus Aufgabe 2b nun so an, dass beim Drücken eines Cancel Buttons kein Fehler aufgerufen wird.

Comments