Seite 1 von 1

Paint funktioniert nicht

Verfasst: Mittwoch 16. Dezember 2009, 17:54
von anga
Ich wollte ein Prrogramm erstellen, dass auf Befehl in xturtle ein Objekt zeichnet. Leider funktioniert das nicht.
(Code für mein Paint unten angehängt)

Kann mir jemand helfen?


Code: Alles auswählen

from xturtle import *
import os
from tkSimpleDialog import *
from tkMessageBox import *

def main():
    print"Willkommen bei ATG-Paint 2.0"
    print""
    print"Du steuerst ATG-Paint mit Befehlen"
    print"Hilfe mit hilfe"
    showinfo("Info", "Man kann ATG-Paint jetzt auch mit Tastaturbefehlen bedienen")
    print""
    eingabeauswahl()

def eingabeauswahl():
    frage = askstring("Auswahl", "Klassisch oder modern(per Tastaturbefehl) ?")
    antwort = raw_input(frage)

    if antwort == "klassisch":
        eingabe_k()

    if antwort == "modern":
        eingabe_m()

def eingabe_m():
    screen.onkey("dreieck", "d")
    screen.onkey("viereck", "v")
    screen.onkey("vieleck", "i")
    screen.onkey("achteck", "a")
    screen.onkey("linie", "l")
    screen.onkey("rechts", "r")
    screen.onkey("links", "s")
    screen.onkey("jump", "j")
    screen.onkey("rueck", "space")
    

def eingabe_k():
    antwort = askstring("ATG-Paint Eingabefenster", "Befehl:")
    if antwort == "hilfe":
        hilfe()

    if antwort == "dreieck":
        dreieck()

    if antwort == "viereck":
        viereck()

    if antwort == "vieleck":
        vieleck()

    if antwort == "achteck":
        achteck()

    if antwort == "linie":
        linie()

    if antwort == "rechts":
        rechts()

    if antwort == "links":
        links()

    if antwort == "jump":
        jump()

    if antwort == "rueck":
        rueck()

    eingabe()

hilfe = """Hilfe:

            Fuer klassisch:
            
            hilfe - Hilfe
            dreieck - Dreieck
            viereck - Viereck
            vieleck - Vieleck
            achteck - Achteck
            linie - Linie
            rechts - nach Rechts
            links - nach Links
            jump - macht Sprung ohne zu Zechnen
            rueck - rueckgaengig

            Fuer modern:
            
            d - dreieck
            v - viereck
            i - vieleck
            a - achteck
            l - linie
            r - rechts
            s - links
            j - jump
            leertaste - rueckgaengig
            """


def hilfe():
    showinfo("ATG-Paint Hilfefenster", hilfe)
    
def dreieck():
    laenge = askstring("Laenge", "Laenge:")
    winkel = askstring("Winkel", "Winkel:")
    fd(laenge)
    lt(winkel)
    fd(laenge)
    lt(winkel)
    fd(laenge)
    lt(winkel)
    fd(laenge)

def viereck():
    laenge = askstring("Laenge", "Laenge:")
    winkel = askstring("Winkel", "Winkel:")
    fd(laenge)
    lt(winkel)
    fd(laenge)
    lt(winkel)
    fd(laenge)
    lt(winkel)
    fd(laenge)

def vieleck():
    laenge = askstring("Laenge", "Laenge:")
    winkel = askstring("Winkel", "Winkel:")
    anzahl = askstring("Anzahl", "Anzahl Ecken:")
    for i in range(anzahl):
        fd(laenge)
        lt(winkel)

def achteck():
    laenge = askstring("Laenge", "Laenge:")
    winkel = askstring("Winkel", "Winkel:")
    for i in range(8):
        fd(laenge)
        lt(winkel)

def linie():
    laenge = askstring("Laenge", "Laenge:")
    fd(laenge)

def rechts():
    winkel = askstring("Winkel", "Winkel:")
    rt(winkel)

def links():
    winkel = askstring("Winkel", "Winkel:")
    lt(winkel)

def jump():
    penup()
    laenge = askstring("Laenge", "Laenge:")
    pendown()

def rueck():
    undo()

main()

    

Verfasst: Mittwoch 16. Dezember 2009, 20:11
von BlackJack
@anga: Was heisst "funktioniert nicht"? Welche Fehlermeldung bekommst Du denn?

Verfasst: Donnerstag 17. Dezember 2009, 11:06
von mkesper
Ich vermute mal, dir fehlt noch eine Schleife, die immer wieder nach der Eingabe fragt. A propos: Wo ist eigentlich eingabe() definiert?

Zitat

Verfasst: Freitag 18. Dezember 2009, 17:39
von anga
mkesper hat geschrieben:Ich vermute mal, dir fehlt noch eine Schleife, die immer wieder nach der Eingabe fragt. A propos: Wo ist eigentlich eingabe() definiert?
OK, eine Schleife könnte ich noch einfügen. Aber, eingabe() habe ich in main() mit eingabeauswahl() definiert. Eingabeauswahl verweis auf eingabe_k() und eingabe_m(), was soviel wie k für klassisch und m für modern heist. Steht aber auch in der Hilfe.

Verfasst: Freitag 18. Dezember 2009, 20:28
von BlackJack
@anga: Mit anderen Worten hast Du `eingabe()` überhaupt nicht definiert. Es wird aber aufgerufen. Das sollte man vielleicht lassen. ;-)

Korrektur

Verfasst: Freitag 1. Januar 2010, 20:35
von anga
BlackJack hat geschrieben:@anga: Mit anderen Worten hast Du `eingabe()` überhaupt nicht definiert. Es wird aber aufgerufen. Das sollte man vielleicht lassen. ;-)
Ich korrigiere:

Line 35: eingabe_m() einfügen
Line 69: eingabe_k() statt eingabe()

Verfasst: Freitag 1. Januar 2010, 21:54
von Hyperion
Hui... der Code sieht aber an vielen Stellen unschön aus.

eingabe_k() könnte man schöner mit einem Dictionary lösen:

Code: Alles auswählen

def dispatch(command):
    if command in commands:
        commands = {
            "hilfe": hilfe,
            "dreieck": dreieck,
            ...
        }
        commands[command]()
und so weiter. Es fehlt natürlich noch die Eingabe des Wortes als solches.

eingabe_m() würde ich auch eher über eine Schleife und ein Dictionary lösen:

Code: Alles auswählen

def eingabe_m():
    names = {
        "dreieck": "d",
        "viereck", "v",
        ...
    }
    for key, value in names:
        screeen.onkey(key, value)
Generell sind die Namen oft schlecht gewählt (eingabe_m() und eingabe_k() z.B. Außerdem fehlt die Doku :-)

Verfasst: Samstag 2. Januar 2010, 19:43
von derdon
Hyperion: Das Dictionary sollte *vor* dem Durchlaufen definiert werden.

Allgemein sollte man statische Definitionen innerhalb von Schleifen vermeiden.

Verfasst: Samstag 2. Januar 2010, 19:44
von Hyperion
derdon hat geschrieben:Hyperion: Das Dictionary sollte *vor* dem Durchlaufen definiert werden.

Allgemein sollte man statische Definitionen innerhalb von Schleifen vermeiden.
Auf welche Code-Stelle beziehst Du Dich genau?

Verfasst: Samstag 2. Januar 2010, 22:29
von derdon
Auf deine Version von eingabe_k

Verfasst: Samstag 2. Januar 2010, 22:52
von Hyperion
Stimmt, das war natürlich Unsinn dort. So muss es lauten:

Code: Alles auswählen

def dispatch(command):
    commands = {
        "hilfe": hilfe,
        "dreieck": dreieck,
        ...
    }
    if command in commands:
         commands[command]() 
Ich war wegen des Wortes Schleife verwirrt, da ich ja nirgends eine verwende.

Ich vermute mal Du beziehst Dich da auf eine Schleife im Code des OP? Insofern willst Du vermutlich das Dictionary commands auf Modul-Ebene verlagern? Imho ist das doch nicht nötig, da es ja nur immer ein dispatch-Objekt gibt und deswegen doch auch nur ein commands-Objekt. Oder liege ich da falsch?

Verfasst: Sonntag 3. Januar 2010, 02:27
von derdon
Oh mann, ich habe "if" gesehen und "for" gelesen. Du warst zu recht verwirrt ;)

Verfasst: Sonntag 3. Januar 2010, 11:35
von anga
BlackJack hat geschrieben:@anga: Was heisst "funktioniert nicht"? Welche Fehlermeldung bekommst Du denn?
Die Fehlermeldung ist diese:
http://www.fileuploadx.de/445309

Verfasst: Sonntag 3. Januar 2010, 11:53
von anga
Inzwischen habe ich weiterprogramiert und habe mir dabei gedacht, dass eingabe_k() mitsamt der Definition und AUsführung unnötig ist. Jetzt will ich nur noch eingabe_m(), die jetzt wieder eingabe() heiist weiterentwickeln. Somit fällt eingabeauswahl() und die hilfe() für eingabe_k() auch raus.
Das Programm soll jetzt nur noch mit screen.onkey() und einer hilfe() als showinfo() bei Start das Programms und als screen.onkey mit h erreichbar sein.

Verfasst: Sonntag 3. Januar 2010, 12:30
von cofi
anga hat geschrieben:Die Fehlermeldung ist diese:
http://www.fileuploadx.de/445309
Starte das doch mal von der Konsole (wenn du nicht weisst wie, siehe Wiki FAQ).
Und bitte vermeide solche Hoster. Das letzte was man als Helfer haben will, ist auf einen Download des Fehlers zu warten ... echte Bilderhoster gibt es zur genuege.