[FOSSGIS-Talk] While-Schleife in Python-Plugin um auf Veränderungen in Attributtabelle zu reagieren
Bernhard Ströbl
nospam at stroweb.de
Mi Sep 28 17:07:15 CEST 2022
Hi Claas,
ich hatte mal eine ähnliche Fragestellung und habe es mit einer eigenen Klasse als Kind von QObject gelöst, darin läuft ein QTimer, der immer wieder neu gestartet wird (und damit quasi im Hintergrund ist). Wenn sich was tut emittet er ein QSignal, das im Hauptprogramm entsprechend verarbeitet wird.
Quelltext per PM
Grüße
Bernhard
> Claas Leiner <claas.leiner at gkg-kassel.de> hat am 28.09.2022 16:16 CEST geschrieben:
>
>
> Hallo Kolleginnen und Kollegen,
>
> ich bin ja jetzt auch immer wieder mit Python unterwegs
> und versuche folgende umzusetzen:
>
> In einem Punkt-Shapefile (leider Shapefile) gibt es
> die Spalte M1. Wenn ein externes Programm auf die DBF zugrieft und den
> Attributwert 50 in M1 einträgt, soll QGIS automatisch zu den
> betreffendem Punkt zoomen.
>
> Ich bekommes es in meinem Plugin hin, das QGIS mit einem Klick auf ein
> Icon automatisch zu den Punkten zoomt
>
> QGIS soll diese Veränderungen jedoch im Hintergrund erkennen und
> automatisch reagieren. Also ich klicke aufs Icon und nichts passiert,
> wenn kein Wert 50 vorhanden ist. Die Schaltfläche bleibt "checked" und
> wenn das externe Programm eine 50 in M1 einträgt, reagiert QGIS, ohne
> das ich ein weiteres mal klicken muss.
>
> Ich habe versucht das folgendermaßen umzusetzen:
> Mit einem Klick auf ein Icon wird folgende Funktion aufgerufen:
> -----------------------------------
>
> def tis_bau(self, checked):
> vlayer = QgsProject.instance().mapLayersByName("Baeume")[0]
>
> while checked:
> time.sleep(1)
> expr = QgsExpression('"M1"=50')
> it = vlayer.getFeatures( QgsFeatureRequest(expr) )
> anz = len(list(it))
>
> if anz > 0:
> #hier die Anwesiungen um zu den Objekten zu zoomen
>
> else:
> continue
> else:
> # hier igentetwass
> break
> --------------------------------
>
> Die While-Schleife soll im Sekundentakt prüfen, ob der Wert 50
> eingetragen wurde und im Entdeckungsfall die Aktion auslösen.
> Wenn jetzt aber keine 50er gefunden werden, friert die While-Schleife
> QGIS ein.
> Ist es möglich, den Code so zu zuschreiben, dass die While-Schleife im
> Hintergrund läuft, ohne die Benutzeroberfläche zu blockieren?
> Kann ich mein Ziel mit diesem Ansatz überhaupt erreichen?
>
> Ich freue mich über Ideen,
>
> Viele Grüße,
>
> Claas
>
>
>
>
> --
> -----------------------------------------
> GKG-Kassel - Dr.-Ing. Claas Leiner
> QGIS-Support und mehr
>
> Geodatenservice, Kartenwerkstatt &
> GIS-Schule Kassel
>
> Wilhelmshöher Allee 304 E
> 34131 Kassel
> Tel. 0561/56013445
> claas.leiner at gkg-kassel.de
> ----------------------------------------
> http://www.gkg-kassel.de
> ----------------------------------------
> Unterstützen Sie QGIS
> QGIS-DE e.V. | http://qgis.de
> QGIS Projekt | http://qgis.org/de/site/
> --
> ....................................................................
> FOSSGIS Veranstaltungen
> https://www.fossgis.de/news/fossgis-events/
>
> FOSSGIS e.V, der Verein zur Förderung von Freier Software aus dem
> GIS-Bereich und Freier Geodaten!
> https://www.fossgis.de/ https://twitter.com/FOSSGIS_Verein
>
> ____________________________________________________________________
> FOSSGIS-Talk-Liste mailing list
> FOSSGIS-Talk-Liste at fossgis.de
> https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste
Mehr Informationen über die Mailingliste FOSSGIS-Talk-Liste