raw_input beim abrechen der Eingabe kommt fehlermeldung

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
anfänger
User
Beiträge: 3
Registriert: Dienstag 31. Juli 2007, 09:56

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
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...'
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Packe es in ein try...except KeyboardInterrupt ein...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Wozu ist denn das "return False" in Zeile 12?
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. ;-)
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Ah ok, danke :)
anfänger
User
Beiträge: 3
Registriert: Dienstag 31. Juli 2007, 09:56

Danke für die Antwort ich werde es gleich ausprobieren!

Natürlich gibt es auch eine Rückmeldung ob es funktioniert hat!
anfänger
User
Beiträge: 3
Registriert: Dienstag 31. Juli 2007, 09:56

Danke nochmal für eure hilfe!
ich habe es jetzt
Antworten