Seite 1 von 1

raw_input beim abrechen der Eingabe kommt fehlermeldung

Verfasst: Dienstag 31. Juli 2007, 10:05
von anfänger
Hallo ich bin ein blutiger Anfänger,

ich habe folgendes Programm geschrieben:

Code: Alles auswählen

def passwort2():
    i=1
    eingabe=''
    while (i<=3 and eingabe <> 'GEHEIM'):
        print 'Passwortabfrage(',i,'.ter Versuch)'
        eingabe = raw_input('Passwort: ')
        if (eingabe == 'GEHEIM'):
            print 'Wir begrüssen Sie'
        elif (i == 3):
            print 'so wirst du NIE das Passwort erraten!'
        else:
            print 'Falsches Passwort'
        i = i + 1


Wenn ich es laufen lasse kommt das Fenster in dem ich das Passwort eingeben soll, wenn ich aber auf cancel bzw. abrechen klicke kommt eine Fehlermeldung: die lautet wie folgt:


Traceback (most recent call last):
File "<interactive input>", line 1, in ?
File "O:\TA-1\TA-16\TA-163\3_Mitarbeiter\34_PraDiDoWS\070416_Bujar_Demiri\Neuer Ordner\blödsinn.py", line 6, in passwort2
eingabe = raw_input('Passwort: ')
File "C:\dSPACE\Common\Python22\Core\lib\site-packages\Pythonwin\pywin\framework\app.py", line 358, in Win32RawInput
raise KeyboardInterrupt, "operation cancelled"
KeyboardInterrupt: operation cancelled



so meine frage lautet jetzt wie kann ich das vermeiden auch wenn ich cancel klicke?

ich bedanke mich schon mal im voraus

Verfasst: Dienstag 31. Juli 2007, 10:46
von BlackJack
Du musst im Programm mit einem ``try``/``except``-Block die Ausnahme behandeln. Zum Beispiel kannst Du das Hauptprogramm in einen solchen Block stecken.

Zum Quelltextschnipsel: Klammern um Bedingungen bei ``while``, ``if`` und Co. braucht man in Python nicht. Test auf ungleich mit ``<>`` ist veraltet, aktuell schreibt man das ``!=``. Die ``<>``-Syntax fliegt soweit ich weiss bei Python 3.0 raus.

Die Schleife ist etwas zu kompliziert, dass bekommt man mit einer ``for``-Schleife kompakter und übersichtlicher hin. ``while``-Schleifen benutzt man üblicherweise, wenn man im Voraus nicht weiss wie oft die Schleife durchlaufen wird. Hier ist die Anzahl 3 aber bekannt. Ausserdem sollte man versuchen sich nicht zu wiederholen. Insbesondere das Passwort in diesem Fall. Wenn man das Passwort ändern will, dann muss man das an zwei Stellen tun anstatt nur an einer.

Code: Alles auswählen

def passwort2(passwort):
    for i in xrange(3):
        print 'Passwortabfrage (%d.er Versuch)' % (i + 1)
        eingabe = raw_input('Passwort: ')
        if eingabe == passwort:
            print 'Wir begrüssen Sie'
            return True
        else:
            print 'Falsches Passwort'

    print 'So wirst du NIE das Passwort erraten!'
    return False


def main():
    try:
        ist_angemeldet = passwort2('GEHEIM')
    except KeyboardInterrupt:
        print '\nProgramm beendet...'

Verfasst: Dienstag 31. Juli 2007, 10:47
von jens
Packe es in ein try...except KeyboardInterrupt ein...

Verfasst: Dienstag 31. Juli 2007, 11:01
von Zizibee
Wozu ist denn das "return False" in Zeile 12?

Verfasst: Dienstag 31. Juli 2007, 11:33
von BlackJack
Als Gegenstück zum ``return True`` in Zeile 7. Ich dachte eine Funktion bei der man sich anmelden kann, das aber dann von aussen nicht feststellen kann, ist ein bisschen sinnfrei. ;-)

Verfasst: Dienstag 31. Juli 2007, 11:47
von Zizibee
Ah ok, danke :)

Verfasst: Dienstag 31. Juli 2007, 14:14
von anfänger
Danke für die Antwort ich werde es gleich ausprobieren!

Natürlich gibt es auch eine Rückmeldung ob es funktioniert hat!

Verfasst: Mittwoch 1. August 2007, 14:31
von anfänger
Danke nochmal für eure hilfe!
ich habe es jetzt