while-Schleife mithilfe einer Eingabe abbrechen

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
mzwle
User
Beiträge: 3
Registriert: Montag 16. März 2015, 20:23

Hallo zusammen,
ich möchte eine while-Schleife mit Hilfe einer Eingabe abbrechen.
Solange jedoch keine Eingabe erfolgt, soll diese Schleife weiterlaufen.
Vorgestellt habe ich es mir so:

Code: Alles auswählen

while 1:
    #auszuführender Code
    if input() == 1:
       break
Jedoch habe ich hier das Problem, dass das Programm immer auf meine Eingabe wartet.

Vielen Dank im Vorraus
mzwle
Sirius3
User
Beiträge: 18217
Registriert: Sonntag 21. Oktober 2012, 17:20

@ mzwle: das macht man mit KeyboardInterrupt und Ctrl+C:

Code: Alles auswählen

try:
    while True:
        # do something
except KeyboardInterrupt:
    pass
mzwle
User
Beiträge: 3
Registriert: Montag 16. März 2015, 20:23

@Sirius3: Vielen Dank für die schnelle Antwort
Wie kann ich jetzt noch festlegen, dass es nur bei einer bestimmten Eingabe die Schleife abbricht?
Sirius3
User
Beiträge: 18217
Registriert: Sonntag 21. Oktober 2012, 17:20

@mzwle: Ctrl+C ist schon seit 50 Jahren der Standard, um etwas abzubrechen.
garreth
User
Beiträge: 41
Registriert: Donnerstag 23. Oktober 2014, 12:04

Hallo mzwle,

wenn du in Python 3 programmierst, ist die Rückgabe von "input()" immer ein String. Diesen versuchst du mit einem Integer zu vergleichen. Folglich wird deine Abfrage niemals wahr sein.
So würde es funktionieren:

Code: Alles auswählen

try:
    while True:
        if input() == str(1):
            break
except KeyboardInterrupt:
    pass
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

garreth hat geschrieben:

Code: Alles auswählen

[...]
        if input() == str(1):
[...]
Da würde man erstens sicher einfach '1' statt str(1) verwendet und zweitens wird die Ausführung der Schleife durch das input angehalten.
garreth
User
Beiträge: 41
Registriert: Donnerstag 23. Oktober 2014, 12:04

/me hat geschrieben:
garreth hat geschrieben:

Code: Alles auswählen

[...]
        if input() == str(1):
[...]
Da würde man erstens sicher einfach '1' statt str(1) verwendet und zweitens wird die Ausführung der Schleife durch das input angehalten.
Richtig, es hätte den selben Effekt und wäre schneller geschrieben. Um die Problematik darzustellen finde ich allerdings "str()" wesentlich aussagekräftiger. Was willst du mir mit zweitens sagen? Klar wartet der Interpreter nach dem input() auf eine Eingabe. Verlassen wird sie aber nur wenn der Nutzer eine "1" eingibt.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

mzwle hat geschrieben:@Sirius3: Vielen Dank für die schnelle Antwort
Wie kann ich jetzt noch festlegen, dass es nur bei einer bestimmten Eingabe die Schleife abbricht?
Das geht plattformübergreifend nicht so einfach, da die Terminals (das schwarze Fenster mit Textcursor und Textein-/ausgabe) sich unterschiedlich verhalten in Windows und unixoiden Systemen. Unter Windows kommst Du mit kbhit() und getch() aus dem Modul msvrct zum Ziel, unter Linux und Consorten gibt es diese Funktionen von Haus aus nicht.
BlackJack

Unter Linux & Co kann man aber das `curses`-Modul für so etwas verwenden.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

garreth hat geschrieben:Klar wartet der Interpreter nach dem input() auf eine Eingabe.
Genau das soll ja nicht passieren. Die Schleife soll permanent durchlaufen werden und wenn eine spezielle Taste (oder Tastenkombination) gedrückt wird, dann soll sie beendet werden.
garreth
User
Beiträge: 41
Registriert: Donnerstag 23. Oktober 2014, 12:04

/me hat geschrieben:Genau das soll ja nicht passieren. Die Schleife soll permanent durchlaufen werden und wenn eine spezielle Taste (oder Tastenkombination) gedrückt wird, dann soll sie beendet werden.
So jetzt hab ich mir das auch nochmal durchgelesen. Du hast Recht, diese Information habe ich überlesen.
mzwle
User
Beiträge: 3
Registriert: Montag 16. März 2015, 20:23

Also gibt es für mein Problem keine Lösung?
BlackJack

@mzwle: Doch, wurden weiter oben genannt: Unter Windows `msvrct` und unter Linux/Unix `curses`.
Antworten