348
Ereignisgesteuerte Programme
Kapitel
13
Farben
Jetzt wollen wir noch eine Möglichkeit einbauen, die Farbe des Zeichen-
stifts zu ändern, damit wir auch bunte Kritzeleien erzeugen können.
Ich schlage vor, nach dem Vorbild größerer Anwendungsprogramme auf der
linken Seite des Fensters eine Art »Werkzeugleiste« unterzubringen: einige
Farb-Buttons zur Wahl der Farbe. Natürlich bieten sich dafür anklickbare
Turtles mit quadratischer Form an. Wenn du sie mit der linken Maustaste
anklickst, soll das die Zeichenfarbe des Stifts ändern, und wenn du sie mit
der rechten Maustaste anklickst, die Füllfarbe.
Für diese Knöpfe brauchen wir Platz und unser Scribble-Programm geht
jetzt auch schon in Richtung richtige Anwendung. Daher wollen wir eine
größere Zeichenfläche haben:
screen.clear()
screen.setup(840, 600)
stift = Turtle()
Erste Idee für die Knöpfe:
def farbButton(farbe, y):
t = Turtle(visible=False)
t.shape("square")
t.speed(0)
t.pu(); t.goto(-380,y)
t.fillcolor(farbe)
def setpencolor(xdummy, ydummy):
stift.pencolor(farbe)
def setfillcolor(xdummy, ydummy):
stift.fillcolor(farbe)
t.onclick(setpencolor)
t.onclick(setfillcolor, 3)
t.showturtle()
Die Funktion
farbButton()
platziert einen »Button« der eben beschriebe-
nen Art links, bei x = -380, in der Höhe y, die als Argument übergeben wird.
Sie verwendet eine ähnliche Technik wie
setpensize()
, das ich weiter
vorn erklärt habe.
>
Füge den Code dieser Funktion unterhalb der Funktion
fuellenum-
schalten()
in
scribble_arbeit.py
ein. Führe das Programm aus
und probiere:
349
Farben
>>> farbButton("red", 120)
>>> farbButton("blue", 80)
>>>
Super, die Knöpfe werden richtig platziert.
>
Klicke z.
B. auf den blauen Knopf, um die Stiftfarbe auf Blau
einzustellen.
Ups! Die Stiftfarbe ist nun wohl Blau, aber leider hat die Turtle einen
Strich bis zum blauen Knopf gezeichnet. Offenbar löst der Mausklick
nicht nur ein Klick-Ereignis auf die Turtle, sondern auch auf die
Zeichenfläche aus. Aber so war das nicht geplant. Zum Glück lässt sich
das reparieren: Wir müssen den Werkzeug-Leisten-Bereich links von x =
-360 schützen. Wenn du dorthin klickst, soll der Stift nicht wie bisher
reagieren. Das geht so:
def jump(x, y):
if x < -360: return
stift.penup()
stift.goto(x, y)
stift.pendown()
def moveto(x, y):
if x < -360: return
stift.goto(x,y)
def fuellenumschalten(xdummy, ydummy):
if xdummy < -360: return
if stift.filling():
stift.end_fill()
## stift.fillcolor("")
else:
stift.begin_fill()
## stift.fillcolor("black")
...
screen.onclick(moveto)
screen.onclick(jump, 2)
screen.onclick(fuellenumschalten, 3)
stift.ondrag(moveto)
...
350
Ereignisgesteuerte Programme
Kapitel
13
>
Führe nun diese Änderungen im Script aus. Füge diese fünf Zeilen wie
gezeigt ein. Zwei Zeilen in
fuellenumschalten()
müssen auskom-
mentiert werden, denn die Füllfarbe wird ab nun von den Farbknöpfen
eingestellt. Und
stift.goto
muss durch
moveto
ersetzt werden,
um den linken Rand zu schützen. Prüfe – wie eben – nach, dass es
nun richtig funktioniert.
Natürlich wollen wir doch etwas mehr Farben verwenden. Die entspre-
chenden Knöpfe kriegen wir so ins Grafik-Fenster:
stift.ondrag(moveto)
for (f, y) in (("red", 160), ("green", 120), ("blue", 80),
("yellow", 40), ("cyan", 0), ("magenta", -40),
("black", -80), ("white", -120)):
farbButton(f, y)
screen.onkeypress(stift.undo, "BackSpace")
>
Füge auch dies noch in den unteren Teil des Scripts, den »Hauptpro-
gramm«-Teil ein und teste das so erweiterte Programm. Fertige eine
bunte Scribbelei an. So was vielleicht:
Schade, dass du die Farben nicht sehen kannst.
351
Farben
>
Wenn du keine Fehler mehr findest, speichere eine Kopie von
scribble_arbeit.py
als
scribble07.py
ab.
Um das Python-»ROCKS«-Bild herzustellen, musste ich mich sehr konzent-
rieren und habe doch immer wieder Fehler mit der
undo
-Taste rückgängig
machen müssen. Grund: Man kann jetzt nicht mehr erkennen, ob Füllen
ein- oder ausgeschaltet ist.
Wie können wir das ändern? Wir installieren einen Füllfarbanzeiger, der die
jeweilige Füllfarbe anzeigt – was bisher der Stift machte. Den können wir
dann wieder verwenden, um den Füllzustand anzuzeigen. Wir erzeugen
einen Füllfarbanzeiger durch folgenden Code:
stift.pensize(3)
fuellanzeiger = Turtle(shape="circle")
fuellanzeiger.pu()
fuellanzeiger.speed(0)
fuellanzeiger.goto(-380, -240)
fuellanzeiger.color("black", "")
screen.onclick(moveto)
Jetzt müssen wir nur noch unsere Knöpfe, oder genauer: die
setfillco-
lor()
-Funktion, so ändern, dass sie die Farbe des Füllfarbanzeigers ändern
und die des Stiftes, wenn er gerade füllt.
def farbButton(farbe, y):
...
def setfillcolor(xdummy, ydummy):
fuellanzeiger.fillcolor(farbe)
if stift.filling():
stift.fillcolor(farbe)
...
Und den Code von
füllenumschalten()
müssen wir so ändern, dass er
wieder wie früher funktioniert, aber eben nicht mit
"black"
, sondern mit
der Füllfarbe, die wir dem Füllfarbanzeiger entnehmen können. Die Metho-
de
fillcolor()
gibt nämlich die Füllfarbe zurück, wenn wir sie ohne
Argument aufrufen.

Get Python für Kids now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.