Eingabedialoge


Mit Dialogfenstern können Parameterwerte interaktiv eingegeben oder verändert werden. Dazu können Textfelder für die Eingabe von Zahlen oder Texten, Checkboxen, Radiobutton und Schieberegler verwendet werden. In Textfeldern können auch Werte als Ausgabe angezeigt werden.

Beispiel 1: Die Anzahl Schritte, Winkel und Anzahl Wiederholungen können in einem Dialogfenster geändert werden. Mit Klick auf OK wird die neue Figur gezeichnet.

Zeichnen Sie weitere Figuren:
Step
Angle
Repeat
200
160
9
200
159.7
60
300
220
60
250
261.7
110

 

# Tu36.py

from gturtle import *

makeTurtle()
hideTurtle()
stepEntry = IntEntry("Step:", 200)
angleEntry = FloatEntry("Angle:", 144)
repeatEntry = IntEntry("Repeat:", 5)
pane1 = EntryPane("Select values and press OK", stepEntry, 
        angleEntry, repeatEntry)
okBtn = ButtonEntry("OK") 
pane2 = EntryPane(okBtn)
statusEntry = StringEntry("", "")
pane3 = EntryPane("Status", statusEntry)
dlg = EntryDialog(700, 10, pane1, pane2, pane3)
dlg.setAlwaysOnTop(True)
 
while not dlg.isDisposed():
    if okBtn.isTouched():
        step = stepEntry.getValue()
        angle = angleEntry.getValue()
        n = repeatEntry.getValue()
        if step == None or angle == None or n == None:
            statusEntry.setValue("Illegal input")
            continue        
        clean()    
        for i in range(n):
            forward(step)
            right(angle)
        statusEntry.setValue("") 
dispose()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

Erklärungen zum Programmcode:

stepEntry = IntEntry() :Erzeugt ein Textfeld zur Eingabe von ganzen Zahlen
angleEntry = FloatEntry() : Erzeugt ein Textfeld zur Eingabe von Dezimalzahlen
pane1 = EntryPane() : Erzeugt einen Bereich (Zone) in dem die Reihenfolge der Eingabefelder festgelegt wird
statusEntry = StringEntry() : Erzeugt ein Textfeld für Rückmeldungen. Falls die Eingabefelder fehlerhafte Zeichen (z. B. Buchstaben, statt Zahlen) erhalten oder falls eine der Eingaben leer ist, erscheint eine Fehlermeldung
dlg = EntryDialog(700, 10, pane1, pane2, pane3) : Erzeugt ein Dialogfenster, welches aus zwei Eingabebereichen besteht und an der Position (700, 10) erscheint
dlg.setAlwaysOnTop(True) : Bewirkt, dass das Dialogfenster nie unter dem Turtlefenster verschwindet
while not dlg.isDisposed(): Führt die Schleife solange durch, bis das Dialogfenster geschlossen wird
if okBtn.isHit(): Falls der Ok-Button gedrückt wird, wird die Figur mit den eingegebenen Werten gezeichnet. Wenn das Turtle-Fenster geschlossen wird, wird auch das Dialogfenster geschlossen.
if isDisposed(): Wenn das Turtle-Fenster geschlossen wird, wird auch das Dialogfenster geschlossen
dispose() : Schliesst das Turtlefenster

 

Beispiel 2: Mit Radiobuttons kann die Turtle-und Stiftfarbe gewählt werden. Das Zeichnen erfolgt unmittelbar nach der Wahl der Farbe.



 

# Tu37.py

from gturtle import *

makeTurtle()
stepEntry = FloatEntry("Step", 200)
pane1 = EntryPane(stepEntry)
setColor("red")
red = RadioEntry("Red")
red.setValue(True)
green = RadioEntry("Green")
blue = RadioEntry("Blue")
pane2 = EntryPane("Turtle Color", red, green, blue)
dlg = EntryDialog(650, 200, pane1, pane2)

while not dlg.isDisposed():
    if isDisposed():
        dlg.dispose()
    if dlg.isChanged():  
        isRed = red.getValue()
        isGreen = green.getValue()
        isBlue = blue.getValue()
        if isRed:
            setColor("red")
            setPenColor("red")
        if isGreen:
            setColor("green")
            setPenColor("green")
        if isBlue:
            setColor("blue")
            setPenColor("blue")
        step = stepEntry.getValue()
        if step == None:
            continue
        forward(step)
        right(160)
dispose() 
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

Erklärungen zum Programmcode:

red = RadioEntry("Red") : Erzeugt einen Radiobutton mit der Anschrift Red
pane2 = EntryPane("Turtle Color", red, green, blue) : Erzeugt einen neuen Eingabe-Bereich mit drei Radiobuttons
if dlg.isModified(): Die nachfolgenden Zeilen werden ausgeführt, wenn einer der Radiobuttons gewählt wird

 

Beispiel 3: Mit Checkboxen kann eine oder mehrere Optionen gewählt werden. Die Figur wird mit Klick auf Ok-Button gezeichnet.


 

# Tu37a.py

from gturtle import *

makeTurtle()

turtleColor = CheckEntry("Change Turtle Color", False) 
penColor = CheckEntry("Change Pen Color", False)
fillColor = CheckEntry("Change Fill Color", False)
pane1 = EntryPane("Turtle Properties", turtleColor, penColor, fillColor)
okBtn = ButtonEntry("Ok") 
pane2 = EntryPane(okBtn)
dlg = EntryDialog(650, 200, pane1, pane2)

while not dlg.isDisposed():
    if isDisposed():
        dlg.dispose()
    if okBtn.isTouched():
        tColor = turtleColor.getValue()
        if tColor:
            setColor("red")
        else:
            setColor("cyan")
        pColor = penColor.getValue()
        if pColor:
            setPenColor("red")
        else:
            setPenColor("blue")
        fColor = fillColor.getValue()
        if fColor:
            setFillColor("red")
        else:
            setFillColor("blue")
        clean()    
        for i in range(4):
            forward(150)
            right(90)
        fill(1, 1)        
dispose()  
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

Erklärungen zum Programmcode:

turtleColor = CheckEntry("Change Turtle Color", False) : Erzeugt eine Checkbox, die nicht selektiert ist

 

Beispiel 4: Mit Schiebereglern (Sliders) wird die Farbe und die Grösse der Figur geregelt.



 

# Tu38.py

from gturtle import *

makeTurtle()
hideTurtle()
sliderRed = SliderEntry(0, 255, 255, 20, 10)  
sliderGreen = SliderEntry(0, 255, 1, 20, 10)  
sliderBlue = SliderEntry(0, 255, 240, 20, 10)  
pane1 = EntryPane("Star Color", sliderRed, sliderGreen, sliderBlue)
sliderSize = SliderEntry(20, 200, 100, 20, 5)
pane2 = EntryPane("Star Size", sliderSize)
dlg = EntryDialog(650, 200, pane1, pane2)
while not dlg.isDisposed():
    if isDisposed():
        dlg.dispose()
    if dlg.isChanged():          
        r = sliderRed.getValue()
        g = sliderGreen.getValue()
        b = sliderBlue.getValue()
        setFillColor(makeColor(r, g, b))
        setPenColor(makeColor(r, g, b))
        clean()
        size = sliderSize.getValue()
        setPos(-size/2, size/2)
        startPath()
        for i in range(6):
            forward(size)
            right(140)
            forward(size)
            left(80)
        fillPath()  
dispose()        
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

Erklärungen zum Programmcode:

sliderRed = SliderEntry(0, 255, 250, 20, 10) : Erzeugt einen Schieberegler für die Regelung des roten Farbanteils der Füllfarbe. Die Parameter bedeuten der Reihe nach: minimaler Wert, maximaler Wert, Initialisierungsposition des Schiebereglers, Abstand der Hauptticks, Abstand der Nebenticks.

 

Beispiel 5: Die Eingabedialoge können auch ohne Turtlegrafik verwendet werden. Im folgenden Beispiel wird mit Hilfe eines Schiebereglers die Frequenz des ersten Tons einer Tonleiter festgelegt. Diese wird danach abgespielt.


 
# Tu39.py

from entrydialog import *

r = 1.05946309
freq = SliderEntry(200, 1000, 444, 100, 50) 
pane1 = EntryPane("f(root) = 444 Hz", freq)
status = StringEntry("", "Waiting for user action")
pane2 = EntryPane("Status", status)

dlg = EntryDialog(pane1, pane2)
dlg.setTitle("Select Root Note")

while not dlg.isDisposed():
    if dlg.isChanged():
        f = freq.getValue() 
        status.setValue("f(root) = %6.1f  Hz" % f)  
        for i in range(13):
            fnext = f * r**i
            status.setValue("Playing with f = %6.1f  Hz" % fnext)  
            playTone(f * r**i, 500, block = True)       
        status.setValue("Waiting for user action")
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

Erklärungen zum Programmcode:

playTone(f , 500, block = True) : Spielt Ton mit der Frenqenz f während 500 Millisekunden ab
fnext = f * r**i : Berechnet die Frequenz des nachfolgenden Halbtons