[FOSSGIS-Talk] While-Schleife in Python-Plugin um auf Veränderungen in Attributtabelle zu reagieren

Bernhard Ströbl nospam at stroweb.de
Do Sep 29 09:23:48 CEST 2022


Hallo Stefan,
ich glaube nicht, dass das hier funktioniert, weil die Änderung an den Attributdaten ja nicht innerhalb von QGIS geschieht sondern von einem Dritten initiiert und durchgeführt wird, d.h. in QGIS wird das Signal gar nicht emittet. Ich bin aber ganz bei Dir, dass das Signal/Slot-Konzept der richtige Weg ist. Im Idealfall schickt die Drittsoftware QGIS eine Info, dass Daten geändert wurden, dann kann das Plugin in QGIS ein Signal emitten und ein Slot zoomt dann hin. Wenn das nicht geht, besteht tatsächlich nur die Möglichkeit, in regelmässigen Abständen den Layer nach einer Änderung zu durchsuchen (wobei sichergestellt werden muss, dass Änderungen auf der Platte in QGIS refresht werden) und wenn es eine Änderung gibt, kommt wieder die Signal/Slot-Schiene zum Einsatz. Wie performant das ist, hängt vermutlich von der Abfragefrequenz und der Anzahl an Datensätzen ab.
Bernhard
 
> Stefan Giese (WhereGroup) <stefan.giese at wheregroup.com> hat am 29.09.2022 07:46 CEST geschrieben:
> 
>  
> Hallo Claas,
> 
> QGIS basiert auf Qt und verwendet das Signal-Slot Konzept. Ein Signal 
> wird von verschiedenen Objekten ausgesendet, wenn was bestimmtes 
> passiert. Ein Slot ist eine Funktion, die dann ausgeführt wird. Das wäre 
> der Weg, den Du verwenden solltest, also bloß keine Schleifen, Timer 
> usw. verwenden! Du musst also in deinem Plugin, deinen Vektorlayer mit 
> einer Funktion verknüpfen, z.B. immer dann wenn der Attributwert sich 
> ändert oder auch wenn ein neuer Wert hinzugefügt wird. Das ganze sieht 
> dann beispielhaft so aus:
> 
> def myFunction():
>      print("huhu")
> 
> # das Signal 'attributeValueChanged' wird verbunden mit der Funktion 
> 'myFunction'
> myLayer.attributeValueChanged.connect(myFunction)
> 
> anschließend wird immer wird immer wenn ein Wert in myLayer geändert 
> wird, die Funktion ausgeführt. Die Verknüpfung kannst Du z.B. beim Start 
> deines Plugins ausführen lassen oder an anderer sinnvoller Stelle, wenn 
> Du Zugriff auf den Layer hast. Die Funktion musst Du natürlich sinnvoll 
> anpassen, so dass z.B. der Wert geprüft wird und dann zoomt. Alle 
> Signale zu einer Klasse findest Du in der PyQGIS Dokumentation,  unter 
> Signals bei der jeweiligen Klasse z.B.: 
> https://qgis.org/pyqgis/3.26/core/QgsVectorLayer.html?highlight=qgsvectorlayer#qgis.core.QgsVectorLayer.attributeValueChanged
> 
> Hoffe, das hilft Dir.
> 
> Viele Grüße
> 
> Stefan
> 
> Mit freundlichen Grüßen
> Stefan Giese
> Projektleiter/Consultant
> ---------------------------------------------
> Aufwind durch Wissen!
> Jetzt neu: Web-Seminare und Online-Schulungen
> bei derwww.foss-academy.com
> ---------------------------------------------
> WhereGroup GmbH
> Schwimmbadstr. 2
> 79100 Freiburg
> Germany
> 
> Tel.: +49 (0)761 / 519 102 - 61
> Fax: +49 (0)761 / 519 102 - 11
> 
> stefan.giese at wheregroup.com
> www.wheregroup.com
> Geschäftsführer:
> Olaf Knopp, Peter Stamm
> Amtsgericht Bonn, HRB 9885
> 
> Am 28.09.2022 um 16:16 schrieb Claas Leiner:
> > 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
> >
> >
> >
> >
> -- 
> Mit freundlichen Grüßen
> Stefan Giese
> Projektleiter/Consultant
> ---------------------------------------------
> Aufwind durch Wissen!
> Jetzt neu: Web-Seminare und Online-Schulungen
> bei derwww.foss-academy.com
> ---------------------------------------------
> WhereGroup GmbH
> Schwimmbadstr. 2
> 79100 Freiburg
> Germany
> 
> Tel.: +49 (0)761 / 519 102 - 61
> Fax: +49 (0)761 / 519 102 - 11
> 
> stefan.giese at wheregroup.com
> www.wheregroup.com
> Geschäftsführer:
> Olaf Knopp, Peter Stamm
> Amtsgericht Bonn, HRB 9885
> -- 
> ....................................................................
> 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