Seite 1 von 1
PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen
Verfasst: Freitag 26. April 2019, 21:08
von Cortez
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
Re: PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen
Verfasst: Freitag 26. April 2019, 21:10
von __deets__
Du kannst auf Knopfdruck den nächsten wert eines Generators berechnen. Das sollte dem recht nahe kommen.
Re: PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen
Verfasst: Freitag 26. April 2019, 21:17
von Cortez
Also ich möchte folgendes:
Code: Alles auswählen
for zähler in range(0, len(liste)):
print ("Test")
if fenster.pushButton.clicked :
continue
Wie lässt sich das mit dem Generatorwert lösen?
Danke dir für die schnelle Antwort.
Re: PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen
Verfasst: Freitag 26. April 2019, 21:34
von __deets__
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)))
Re: PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen
Verfasst: Freitag 26. April 2019, 21:56
von Cortez
Ok, vielen Dank. Werde nachher mal damit rumspielen.
P.S.: Warum sollte man die range-Funktion nicht zum Durchlaufen von Listen nehmen?
Re: PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen
Verfasst: Freitag 26. April 2019, 22:13
von __deets__
Weil man dazu
for ding in liste
macht.
Re: PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen
Verfasst: Freitag 26. April 2019, 22:20
von Cortez
geht bei mir leider nicht, weil in meiner Liste Objekte gespeichert sind und nicht nur Strings oder integers
Re: PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen
Verfasst: Freitag 26. April 2019, 22:24
von snafu
__deets__ hat übrigens absichtlich einen Fehler in seinem Beispielcode eingebaut, da next() das falsche Objekt übergeben bekommt. Wahrscheinlich nur um zu sehen, ob jemand aufpasst.

Re: PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen
Verfasst: Freitag 26. April 2019, 22:28
von snafu
Cortez hat geschrieben: Freitag 26. April 2019, 22:20
geht bei mir leider nicht, weil in meiner Liste Objekte gespeichert sind und nicht nur Strings oder integers
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?
Re: PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen
Verfasst: Freitag 26. April 2019, 22:34
von __deets__
@snafu hat natürlich recht, es muss natürlich it sein. Und auch mit seinen Anmerkungen zur iterierbarkeit. ALLES ist ein Objekt in Python. Ob String, ob int, ob Rumpelstil.
Re: PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen
Verfasst: Freitag 26. April 2019, 22:39
von Cortez
snafu hat geschrieben: Freitag 26. April 2019, 22:28
Cortez hat geschrieben: Freitag 26. April 2019, 22:20
geht bei mir leider nicht, weil in meiner Liste Objekte gespeichert sind und nicht nur Strings oder integers
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.
Re: PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen
Verfasst: Freitag 26. April 2019, 22:49
von __deets__
Das ist etwas anderes gewesen. Ohne Code und konkrete Fehlermeldung kann man dazu nix sagen, aber nochmal: du kannst problemlos über eine Liste iterieren, egal was darin ist.
Re: PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen
Verfasst: Freitag 26. April 2019, 22:52
von snafu
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.

Re: PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen
Verfasst: Freitag 26. April 2019, 23:06
von Cortez
Habe meinen Code nochmals umgebaut um die Fehlermeldung zu bekommen:
Code: Alles auswählen
for zähler in objekte:
if objekte[zähler].attribut1 == "Nikolaus":
print ("Test")
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
Re: PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen
Verfasst: Freitag 26. April 2019, 23:15
von __deets__
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.
Code: Alles auswählen
for zähler in objekte:
if zähler.attribut1 == "Nikolaus":
print ("Test")
Zähler ist dann natürlich ein blöder Name. Aber zur Illustration.
Re: PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen
Verfasst: Samstag 27. April 2019, 10:57
von Cortez
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?
Re: PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen
Verfasst: Samstag 27. April 2019, 11:07
von __deets__
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.
Re: PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen
Verfasst: Samstag 27. April 2019, 12:43
von __blackjack__
@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:
Code: Alles auswählen
for i in range(len(sequence)):
do_something(sequence[i])
# vs.
for item in sequence:
do_something(item)
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:
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)
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.