For-Schleife unterbrechen

Fragen zu Tkinter.
Antworten
leonards
User
Beiträge: 18
Registriert: Samstag 9. Juni 2012, 10:59

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
Gruß Leonard :)
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
leonards
User
Beiträge: 18
Registriert: Samstag 9. Juni 2012, 10:59

ja, so würde ich das auch machen, aber ic möchte das ja in Tkinter machen
Gruß Leonard :)
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

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? :mrgreen:

Stefan
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@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?
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
leonards
User
Beiträge: 18
Registriert: Samstag 9. Juni 2012, 10:59

ich möchte ja, das wenn die bedingung erfüllt ist, das die schleife weiterläuft.
Gruß Leonard :)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@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.
Das Leben ist wie ein Tennisball.
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

@EyDu: Meine Faulheit verträgt sich nicht mit der (außerordentlichen) Wichtigkeit der Variablennamen in Python. :mrgreen: Ist nicht günstig, ich weiß. :roll:
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

"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 ;-)
Das Leben ist wie ein Tennisball.
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

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 :D :D 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 :mrgreen:
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dann solltest du dein Keyboard vielleicht um 180 Grad drehen. Am besten um die Achse senkrecht zur Keyboardoberseite, sonst wird es wirklich kniffelig :D
Das Leben ist wie ein Tennisball.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

Bei Namen bin ich auch total unkreativ und brauche Ewigkeiten :)
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
leonards
User
Beiträge: 18
Registriert: Samstag 9. Juni 2012, 10:59

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
Gruß Leonard :)
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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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)
Das Leben ist wie ein Tennisball.
Antworten