Paint funktioniert nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
anga
User
Beiträge: 13
Registriert: Mittwoch 16. Dezember 2009, 17:36

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()

    
BlackJack

@anga: Was heisst "funktioniert nicht"? Welche Fehlermeldung bekommst Du denn?
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Ich vermute mal, dir fehlt noch eine Schleife, die immer wieder nach der Eingabe fragt. A propos: Wo ist eigentlich eingabe() definiert?
anga
User
Beiträge: 13
Registriert: Mittwoch 16. Dezember 2009, 17:36

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.
BlackJack

@anga: Mit anderen Worten hast Du `eingabe()` überhaupt nicht definiert. Es wird aber aufgerufen. Das sollte man vielleicht lassen. ;-)
anga
User
Beiträge: 13
Registriert: Mittwoch 16. Dezember 2009, 17:36

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()
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :-)
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Hyperion: Das Dictionary sollte *vor* dem Durchlaufen definiert werden.

Allgemein sollte man statische Definitionen innerhalb von Schleifen vermeiden.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Auf deine Version von eingabe_k
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Oh mann, ich habe "if" gesehen und "for" gelesen. Du warst zu recht verwirrt ;)
anga
User
Beiträge: 13
Registriert: Mittwoch 16. Dezember 2009, 17:36

BlackJack hat geschrieben:@anga: Was heisst "funktioniert nicht"? Welche Fehlermeldung bekommst Du denn?
Die Fehlermeldung ist diese:
http://www.fileuploadx.de/445309
anga
User
Beiträge: 13
Registriert: Mittwoch 16. Dezember 2009, 17:36

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Antworten