Seite 1 von 1
For-Schleife unterbrechen
Verfasst: Dienstag 6. November 2012, 16:34
von leonards
Hallo, ich möchte eine for-Schleife unterbrechen, bis die Enter-Taste gedrückt wird. Dann soll die Schleife fortgeführt werden.
Meine Schleife sieht so aus:
Code: Alles auswählen
for i in self.vokabeln.keys():
self.latein.config(text=i)
self.wort = i
Natürlich verändert die Schleife den Text von self.latein direkt hintereinander, er soll aber self.latein verändern und dann warten, bis die Enter-Taste gedrückt wird.
Vielen Dank für Hile
Re: For-Schleife unterbrechen
Verfasst: Dienstag 6. November 2012, 17:06
von mutetella
Ich kenne Tkinter nicht, aber um etwas abzufangen, musst Du an das widget, in dem etwas geschieht, den event <Return>-key pressed binden und dabei bestimmen, was geschehen soll, wenn eben dieser event ausgelöst wird.
Lies mal z. B.
das hier. Hilft Dir sicher weiter.
Innerhalb der Schleife, die Du als Beispiel angibst, würde ein 'raw_input()' ausreichen.
Code: Alles auswählen
for wort in ['eins', 'zwei', 'drei']:
print wort
raw_input()
mutetella
Re: For-Schleife unterbrechen
Verfasst: Dienstag 6. November 2012, 17:09
von leonards
ja, so würde ich das auch machen, aber ic möchte das ja in Tkinter machen
Re: For-Schleife unterbrechen
Verfasst: Dienstag 6. November 2012, 17:49
von StefanLawl
Eventuell kannst du mit break arbeiten?
Code: Alles auswählen
>>> for _ in xrange(10):
... print _
... if _ == 5:
... break
...
0
1
2
3
4
5
Eventuell break in Verbindung mit einem Button?
Stefan
Re: For-Schleife unterbrechen
Verfasst: Dienstag 6. November 2012, 17:52
von mutetella
@leonards
1. Es macht keinen Sinn, denselben Thread in 2 Forenbereichen zu posten. Wo soll Dir wer wann antworten?
2. Hast Du meine Antwort nicht gelesen?
Re: For-Schleife unterbrechen
Verfasst: Dienstag 6. November 2012, 17:53
von leonards
ich möchte ja, das wenn die bedingung erfüllt ist, das die schleife weiterläuft.
Re: For-Schleife unterbrechen
Verfasst: Dienstag 6. November 2012, 17:58
von EyDu
@StefanLawl: Wenn du einen Wert an einen Unterstrich bindest, dann ist dass keine Abkürzung um sich einen Namen zu sparen, sondern ein Hinweise darauf, dass der Wert nicht weiter verwendet wird. Wenn du also lesend auf _ zugreifst, in deinem Fall mittels print ausgibst oder vergleichst, dann willst du einen Namen vergeben.
Re: For-Schleife unterbrechen
Verfasst: Dienstag 6. November 2012, 18:10
von StefanLawl
@EyDu: Meine Faulheit verträgt sich nicht mit der (außerordentlichen) Wichtigkeit der Variablennamen in Python.

Ist nicht günstig, ich weiß.

Re: For-Schleife unterbrechen
Verfasst: Dienstag 6. November 2012, 18:17
von EyDu
"i" ist in diesem Fall auch so viel länger als "_". Aber das schöne ist ja: die Zeit, welche man durch schlechte Namensgebug eingespart hat, verliert man mehrfach wenn man den Code noch einmal anfassen muss. Du bist also vielleicht nachlässig, unstrukturiert, inkosequent, planlos uns ignorierst alle Folgen, faul ist das aber nicht

Re: For-Schleife unterbrechen
Verfasst: Dienstag 6. November 2012, 18:25
von StefanLawl
EyDu hat geschrieben:"i" ist in diesem Fall auch so viel länger als "_". Aber das schöne ist ja: die Zeit, welche man durch schlechte Namensgebug eingespart hat, verliert man mehrfach wenn man den Code noch einmal anfassen muss. Du bist also vielleicht nachlässig, unstrukturiert, inkosequent, planlos uns ignorierst alle Folgen, faul ist das aber nicht

_ liegt mir besser in den Fingern als i, komische Finger

Jedenfalls wollte ich noch sagen, dass meine Faulheit nur bei "schnell-schnell-Akten" ist. Bei richtigen Programmen lasse ich mir Zeit für Namensgebung
Stefan

Re: For-Schleife unterbrechen
Verfasst: Dienstag 6. November 2012, 18:50
von EyDu
Dann solltest du dein Keyboard vielleicht um 180 Grad drehen. Am besten um die Achse senkrecht zur Keyboardoberseite, sonst wird es wirklich kniffelig

Re: For-Schleife unterbrechen
Verfasst: Dienstag 6. November 2012, 19:41
von mutetella
Luschdig... gerade komm' ich von meinem Sohnemann, der irre genervt war, weil ich immer so "ewig überleg'", wie ich jetzt diese Liste oder sonstwas wohl nennen könnte anstatt ihm "schnell mal" zu sagen, warum sein code nicht das tut, was er erwartet... "Schreib' halt irgendwas, Manno...!"
Aber es ist tatsächlich so, dass ich viel Zeit dafür verwende, passende Namen zu finden. Und umso schwerer ich mir tue, einen passenden Namen zu finden, umso wahrscheinlicher ist es, dass meine Vorgehensweise nicht ganz so geschickt ist...
Nur 'ne Erfahrung von mir...
mutetella
Re: For-Schleife unterbrechen
Verfasst: Dienstag 6. November 2012, 21:18
von StefanLawl
Bei Namen bin ich auch total unkreativ und brauche Ewigkeiten

Re: For-Schleife unterbrechen
Verfasst: Mittwoch 7. November 2012, 16:02
von leonards
Vielen Dank für Hilfe, ich habe das Problem folgendermaßen gelößt:
Code: Alles auswählen
for i in self.vokabeln.keys():
if i in self.woerter: self.latein.config(text=i)
else:
self.latein.config(text=i)
self.wort = i
self.woerter + [i]
break
Re: For-Schleife unterbrechen
Verfasst: Mittwoch 7. November 2012, 17:23
von BlackJack
@leonards: Das sieht komisch und ineffizient aus. Was hast Du denn an Daten, in welchen Strukturen, und was ist das eigentliche Ziel? Sollte es das Abfragen von Vokabeln sein, die im Wörterbuch `self.vokabeln` stehen und Du jedes mal wenn der Code ausgeführt wird eine andere Vokabel haben möchtest, dann solltest Du am Anfang eine Liste mit den Schlüsseln erstellen und von der in jedem Schritt einfach eine mit `pop()` entfernen, oder statt der Liste einen Iterator erstellen und in jedem Schritt von dem mit `next()` das nächste Element abfragen. Diese ``for``-Schleife und eventuell sogar eine Liste mit den Wörtern die schon dran waren, sind umständlich und ineffizient.
Bitte verwende `i` nicht für Werte die keine ganzen Zahlen sind, insbesondere nicht in Schleifen. Das ist verwirrend. Zumal der Name `i` überhaupt nicht verrät was der Wert hier eigentlich bedeutet. Dafür sind Namen aber gedacht.
Auch einzeilige Blöcke sollte man eingerückt in eine eigene Zeile setzen und nicht hinter den ``:``. Das ist einfach besser lesbar.
Wenn ``if``- und ``else``-Block gleichen Code enthalten, den man an den Anfang oder das Ende ziehen kann, in diesem Fall das ``self.latein.config(text=i)``, dann sollte der gemeinsame Code nicht in dem Konstrukt stehen, sondern davor beziehungsweise danach, weil es dort dann nur *einmal* stehen muss. Hier wäre der ``if``-Zweig dann leer und damit überflüssig wenn man die Bedingung einfach umkehrt.
Das ``self.woerter +
`` hat keinen Effekt, sofern `self.woerter` nicht an einen Datentyp gebunden ist, der sich „komisch” verhält, was die Addition angeht. Ich tippe mal auf eine Liste und da macht die Zeile so keinen Sinn.
Das hier macht genau das selbe wie Dein Quelltext:
Code: Alles auswählen
for wort in self.vokabeln.keys():
self.latein.config(text=wort)
if wort not in self.woerter:
self.wort = wort
break
Wobei ich nicht sehe warum man `config()` für jedes Wort aufrufen sollte und es nicht auch in das ``if`` ziehen sollte. Aber wie gesagt ist das sowieso ineffizient auf diese Art.
Re: For-Schleife unterbrechen
Verfasst: Mittwoch 7. November 2012, 17:30
von EyDu
Nimm doch einfach den Iterator
Code: Alles auswählen
def __init__(...):
self.vokabeln = ...
self.it_vokabeln = self.vokabeln.iterkeys()
def on_enter(...):
try:
word = next(self.it_vokabeln)
except StopIteration:
word = "---"
self.latein.config(text=word)