Benutzer-Werkzeuge

Webseiten-Werkzeuge


malprogramm

Scribble - das Malprogramm

# -*- coding: utf-8 -*-
 
# Python für Kids (4. Auflage) - Kapitel 13
 
# Ereignisgesteuerte Programme
 
 
 
# Autor: Gregor Lingl
 
# Datum 16. 8. 2009
 
 
 
# scribble - ein einfaches Zeichenprogramm
 
 
 
# (1) Stift zeichnet eine Linie zur (links) angeklickten Stelle
 
# (2) Stift springt (ohne Zeichnen) zur rechts angeklickten Stelle
 
# (3) Stift kritzelt, wenn er gezogen wird
 
# (4) mittlere Maustaste schaltet füllen ein und aus
 
# (5) undo() - Funktion des Stiftes an BackSpace-Taste binden
 
# (6) Strichdicken 1..9 an Tasten "1" .. "9" binden
 
# (7) Mit Leertaste Zeichnung löschen
 
# (8) Farbknöpfe:
 
#     - mit linker Maustaste anklicken: Zeichenfarbe
 
#     - mit rechter Maustaste anklicken: Füllfarbe
 
# (9) Füllfarbanzeiger einführen - Turtle zeigt Füllzustand an.
 
# (10) Bild als Postscript speichern und in png-Datei konvertieren
 
# (11) Hilfebildschirm ein (F1) und aus (Escape)
 
# (12) = final -- scribble_undo hack, tracer(False) fur GUI-Aufbau,
 
#      F1 - Hinweis im Titel
 
 
 
from turtle import *
 
import sys
 
sys.setrecursionlimit(20000)
 
 
 
GHOSTSCRIPTFILE = "C:/Programme/gs/gs8.60/bin/gswin32c.exe "
 
SCREENBREITE = 800
 
SCREENHOEHE = 600
 
RAND = 40
 
WERKZEUGBREITE = WB = 35
 
LINKERRAND = - SCREENBREITE / 2 + 40
 
 
 
def save():
 
    import os
 
    filename = screen.textinput("Grafik speichern", "Dateiname:")
 
    screen.update()
 
    cv = screen.getcanvas()
 
    cv.postscript(file=filename+".ps", x=LINKERRAND)
 
    os.system( GHOSTSCRIPTFILE +
 
                      "-sDEVICE=png16m -o {0}.png {0}.ps".format(filename))
 
    screen.listen()
 
 
 
def waehlelinienfarbe():
 
    farbe = askcolor()
 
    stift.pencolor(farbe[1])
 
 
 
def waehlefuellfarbe():
 
    farbe = askcolor()[1]
 
    fuellanzeiger.fillcolor(farbe)
 
    if stift.fill():
 
        stift.fillcolor(farbe)   
 
 
 
def jump(x, y):
 
    if x < LINKERRAND: return
 
    stift.penup()
 
    stift.goto(x, y)
 
    stift.pendown()
 
 
 
def moveto(x, y):
 
    if x < LINKERRAND: return
 
    stift.goto(x,y)    
 
 
 
def fuellenumschalten(xdummy, ydummy):
 
    if xdummy < LINKERRAND: return
 
    if stift.fill():
 
        stift.end_fill()
 
        stift.fillcolor("")
 
    else:
 
        stift.begin_fill()
 
        stift.fillcolor(fuellanzeiger.fillcolor())
 
 
 
def scribble_undo():
 
    # the scribble_undo hack 
 
    stift.undo()
 
    if not stift.fill() and stift.fillcolor():
 
        stift.undo()
 
        stift.fillcolor("")
 
 
 
def farbButton(farbe, y):
 
    t = Turtle(visible=False)
 
    t.shape("square")
 
    t.speed(0)
 
    t.pu(); t.goto(LINKERRAND-20,y);
 
    t.fillcolor(farbe)
 
    def setpencolor(xdummy, ydummy, c=farbe):
 
        stift.pencolor(c)
 
    def setfillcolor(xdummy, ydummy, c=farbe):
 
        fuellanzeiger.fillcolor(c)
 
        if stift.fill():
 
            stift.fillcolor(c)
 
    t.onclick(setpencolor)
 
    t.onclick(setfillcolor, 3)
 
    t.showturtle()
 
 
 
def show_help():
 
    screen.title("SCRIBBLE - Das Malprogramm")
 
    helper.stamp()
 
    helptext = """
 
                   SCRIBBLE - Hilfe
 
 
 
Maus-Kommandos für die Zeichenfläche:
 
-------------------------------------
 
Mausklick links -- zeichnet Linie zur Mausposition
 
Mausziehen links -- zeichnet Linie längs der Mausbewegung
 
Mausklick Mitte -- bewegt Stift zur Mausposition
 
Mausklick rechts -- schaltet Füllen ein bzw. aus
 
 
 
Maus-Kommandos für die Farb-Buttons:
 
------------------------------------
 
Mausklick links -- stellt Stiftfarbe ein
 
Mausklick rechts -- stellt Füllfarbe ein. Die Füllfarbe
 
                    wird unten im Füllfarbanzeiger angezeigt
 
 
 
Tastatur-Kommandos:
 
-------------------
 
"1" .. "9" -- stellt Strichdicke auf die Werte 1 .. 9
 
Backspace -- macht die letzten Zeichenvorgänge rückgängig
 
Leertaste -- löscht Zeichnung
 
"l" -- ruft Farbauswahldialog für die Linienfarbe auf
 
"f" -- ruft Farbauswahldialog für die Füllfarbe auf
 
"s" -- Speichert das gescribblete Bild als *.png-Datei
 
F1  -- ruft diese Hilfe auf
 
Escape -- schließt den Hilfe Bildschirm. 
 
"""
 
    helper.goto(0, -260)
 
    helper.write(helptext, align="center", font=("Courier", 14, "bold"))
 
    helper.home()
 
 
 
 
 
screen = Screen()
 
screen.clear()
 
screen.setup(SCREENBREITE+RAND, SCREENHOEHE+RAND)
 
screen.screensize(SCREENBREITE, SCREENHOEHE)
 
screen.title("SCRIBBLE - Das Malprogramm   (Hilfe: F1)")
 
screen.tracer(False)
 
stift = Turtle()
 
stift.speed(0)
 
stift.shape("circle")
 
stift.shapesize(0.4, 0.4, 3)
 
stift.pensize(3)
 
 
 
fuellanzeiger = Turtle(shape="circle")
 
fuellanzeiger.pu()
 
fuellanzeiger.speed(0)
 
fuellanzeiger.goto(LINKERRAND-20, -SCREENHOEHE / 2 + WERKZEUGBREITE)
 
fuellanzeiger.color("black", "")
 
 
 
helper = Turtle(shape="square", visible=False)
 
helper.pu()
 
helper.speed(0)
 
helper.fillcolor("white")
 
helper.shapesize(35,29,3)
 
 
 
screen.onclick(moveto)
 
screen.onclick(jump, 2)
 
screen.onclick(fuellenumschalten, 3)
 
stift.ondrag(moveto)
 
 
 
for (f,y) in (("red", 4*WB), ("green", 3*WB), ("blue", 2*WB),
 
              ("yellow", WB), ("cyan", 0), ("magenta", -WB),
 
              ("black", -2*WB), ("white", -3*WB)):
 
    farbButton(f, y)
 
 
 
screen.onkey(scribble_undo, "BackSpace")
 
for c in "123456789":
 
    def setpensize(ps=int(c)):
 
        stift.pensize(ps)
 
        stift.shapesize(0.2 + ps/10)
 
    screen.onkey(setpensize, c)
 
screen.onkey(stift.clear, "space")
 
screen.onkey(save, "s")
 
screen.onkey(waehlelinienfarbe, "l")
 
screen.onkey(waehlefuellfarbe, "f")
 
screen.onkey(show_help, "F1")
 
screen.onkey(helper.clear, "Escape")
 
screen.tracer(True)
 
screen.listen()
 
mainloop()
malprogramm.txt · Zuletzt geändert: 2010/05/13 19:56 (Externe Bearbeitung)