Hallo,
ich hätte eine Frage zu PyQt5.
Und zwar müssen ja die Methoden wie clicked usw. mit einer Funktion verbunden werden. Nun habe ich folgendes Problem: Ich möchte, dass eine Programmschleife auf Druck eines Pushbuttons weiterläuft(also z.B. das nächste Element einer Liste in der Konsole, einem LineEdit etc... ausgibt). Geht sowas? Und falls nicht, gibt es Alternativen um zu diesem Ziel zu kommen?
Viele Grüße,
Cortez
PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen
Also ich möchte folgendes:
Wie lässt sich das mit dem Generatorwert lösen?
Danke dir für die schnelle Antwort.
Code: Alles auswählen
for zähler in range(0, len(liste)):
print ("Test")
if fenster.pushButton.clicked :
continue
Danke dir für die schnelle Antwort.
Bitte niemals mit range über eine Liste laufen. Nie. Wirklich nicht.
Code: Alles auswählen
it = iter(liste)
fenster.pushButton.clicked(lambda: print(next(liste)))
Die Art der Objekte ist dabei völlig egal und im Übrigen auch eine haarsträubende Begründung / Vermutung. Wie kommst du darauf, dass sich Zahlen und Strings beim Iterieren anders verhalten als alle übrigen Objekte? Gab es eine Fehlermeldung, die du womöglich falsch verstanden hast?
richtig, gab ne Fehlermeldung. Den Wortlaut krieg ich nicht mehr hin, aber es kam die Meldung, dass das zu Iterierende str oder int sein müsse und nicht Instanz der betreffenden Klasse.snafu hat geschrieben: ↑Freitag 26. April 2019, 22:28Die Art der Objekte ist dabei völlig egal und im Übrigen auch eine haarsträubende Begründung / Vermutung. Wie kommst du darauf, dass sich Zahlen und Strings beim Iterieren anders verhalten als alle übrigen Objekte? Gab es eine Fehlermeldung, die du womöglich falsch verstanden hast?
Wie gesagt, am besten ganz schnell wieder vergessen. So ziemlich jedes Grundlagen-Tutorial sagt einem etwas in dieser Art:
Und etwas anderes sollte man sich auch gar nicht angewöhnen. Spätestens wenn man verschachtelte Schleifen oder List Comprehensions hat, will man range() wirklich nicht mehr ohne Not benutzen. Und falls du mal nur einen Ausschnitt aus einer Liste benötigst, dann hol sie dir per Slicing, aber nicht mit range(). Sonst wird dich kein halbwegs erfahrener Python-Programmierer mehr ernstnehmen, sobald er deinen Code sieht.
Code: Alles auswählen
for obj in objekte:
tu_was(obj)
Habe meinen Code nochmals umgebaut um die Fehlermeldung zu bekommen:
Ich erhalte folgende Fehlermeldung: list indices must be integers or slices, not (Objekte der betreffenden Klasse)
PS: Blödes Codebeispiel, aber soll nur zur Verdeutlichung dienen
Code: Alles auswählen
for zähler in objekte:
if objekte[zähler].attribut1 == "Nikolaus":
print ("Test")
PS: Blödes Codebeispiel, aber soll nur zur Verdeutlichung dienen
Zähler IST dein Objekt. Genau darum geht es doch. Du musst genau NICHT per Index auf die Liste zugreifen. Sondern bekommst die Objekte nacheinander geliefert.
Zähler ist dann natürlich ein blöder Name. Aber zur Illustration.
Code: Alles auswählen
for zähler in objekte:
if zähler.attribut1 == "Nikolaus":
print ("Test")
Danke dir für die Antwort. Ich habe meinen Denkfehler erkannt.
Ich bitte um Verständnis für meine Fragen, die euch erfahrenen Programmierer sicherlich trivial vorkommen - aber als Einsteiger sieht man, trotz Durcharbeiten eines Tutorials, manchmal den Wald vor lauter Bäumen nicht. Alles Wissen von den Tutorials muss halt praktisch umgesetzt werden - und da hat man halt als Neuling mal ein Brett vorm Kopf. Also, wenn ich was frage, dann ist es nicht Faulheit, sondern nur, wenn mir wirklich was im Moment unklar ist.
P.S. Mir ist z.B. noch unklar, warum die for-Schleife mit der range-Funktion für Listen unangebrach ist. Ich habe verstanden, dass man es nicht macht und habe meinen Code auch entsprechend abgeändert - aber was ist an der anderen Lösung besser? Oder hat das schlicht was mit Stil und Lesbarkeit des Codes zu tun?
Ich bitte um Verständnis für meine Fragen, die euch erfahrenen Programmierer sicherlich trivial vorkommen - aber als Einsteiger sieht man, trotz Durcharbeiten eines Tutorials, manchmal den Wald vor lauter Bäumen nicht. Alles Wissen von den Tutorials muss halt praktisch umgesetzt werden - und da hat man halt als Neuling mal ein Brett vorm Kopf. Also, wenn ich was frage, dann ist es nicht Faulheit, sondern nur, wenn mir wirklich was im Moment unklar ist.
P.S. Mir ist z.B. noch unklar, warum die for-Schleife mit der range-Funktion für Listen unangebrach ist. Ich habe verstanden, dass man es nicht macht und habe meinen Code auch entsprechend abgeändert - aber was ist an der anderen Lösung besser? Oder hat das schlicht was mit Stil und Lesbarkeit des Codes zu tun?
Es gibt eine Reihe von Gründen, warum das vorzuziehen ist:
- Ästhetische, es ist weniger “rödelig”, kein indexzugriff, weniger Klammern etc.
- weniger Ansprüche an das iterierbare Objekt. Wieviele Zeilen hat denn zb eine Datei, über die du iterieren willst? Weißt du vorher gar nicht. Alles was du wissen musst ist, “gib mir so lange was, bis nix mehr da ist”. Das ist deutlich weniger als “verrate mir wieviele Element du hast. Und erlaube mir wahlfreien(!!) Zugriff darauf”.
- als Konsequenz aus dem letzten Punkt wird der Code generischer. Kann dadurch eben mit Quellen umgehen, die zb Werte nur auf Anforderung generieren können.
- ebenfalls als Konsequenz können Speicher- und Laufzeitgewinne erziehlt werden. Solange durch eine 100GB große Datei Stiefeln, bis eine bestimmte Zeile gefunden wurde? Kein Problem. Musst du die aber erstmal komplett einlesen, brauchst du vorher ein Speicherupgrade.
- Ästhetische, es ist weniger “rödelig”, kein indexzugriff, weniger Klammern etc.
- weniger Ansprüche an das iterierbare Objekt. Wieviele Zeilen hat denn zb eine Datei, über die du iterieren willst? Weißt du vorher gar nicht. Alles was du wissen musst ist, “gib mir so lange was, bis nix mehr da ist”. Das ist deutlich weniger als “verrate mir wieviele Element du hast. Und erlaube mir wahlfreien(!!) Zugriff darauf”.
- als Konsequenz aus dem letzten Punkt wird der Code generischer. Kann dadurch eben mit Quellen umgehen, die zb Werte nur auf Anforderung generieren können.
- ebenfalls als Konsequenz können Speicher- und Laufzeitgewinne erziehlt werden. Solange durch eine 100GB große Datei Stiefeln, bis eine bestimmte Zeile gefunden wurde? Kein Problem. Musst du die aber erstmal komplett einlesen, brauchst du vorher ein Speicherupgrade.
- __blackjack__
- User
- Beiträge: 13079
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Cortez: Ich hätte gedacht es ist recht offensichtlich warum Code der direkt, ohne den Umweg über einen zusätzlichen Index, über eine Sequenz iteriert besser ist. Wenn man das mal vergleicht:
Die zweite Variante kann man fast wie einen Satz lesen der aussagt was der Code macht. Den gleichen Satz würde man auch zur Beschreibung der ersten Variante vewenden, nur das da der Code das ein bisschen umständlicher formuliert. Und man hat oft auch als erstes in der Schleife immer so etwas wie ``item = sequence[ i ]`` stehen um einen Namen für das Element zu haben. Das ist bei den generischen Namen wie `sequence` und `item` natürlich nicht so wichtig, aber normalerweise gibt man da ja sinnvolle Namen die dem Leser Informationen liefern. Man vergleiche beispielsweise das hier:
Obwohl das auch noch recht generisch ist, machen die Namen das IMHO lesbarer. Noch grösser wird der Unterschied wenn man da konkrete Namen für die Bedeutung der Werte in der Tabelle verwendet.
Code: Alles auswählen
for i in range(len(sequence)):
do_something(sequence[i])
# vs.
for item in sequence:
do_something(item)
Code: Alles auswählen
for i in range(len(table)):
for j in range(len(table[i])):
do_something(table[i][j])
# vs.
for row in table:
for cell in row:
do_something(cell)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman