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

Claas Leiner claas.leiner at gkg-kassel.de
Do Sep 29 12:04:17 CEST 2022


Hallo Bernhard und Stefan,

vielen Dank für die Unterstützung!

Das hilft mir schon mal wieder um weiter ins Python unter QGIS 
einzusteigen. Das mit dem Slot-Signal-Konzept muss noch mal 
durchfringen. Das hört sich aber sehr spannend an.

Ich hatte noch eine Mail von Thoma Baumann bekommen, auf deren Grundlage 
ich mein Problem lösen konnte. Mit dem Qtimer.
Das hatte der Thomas leider nicht über die Liste geschickt, daher 
zitiere ich die Mail hier:

------------------------
Hallo Claas,
mal off-list ne kurze Antwort, denn die Antwort von Bernhard Ströbl 
klingt ja vielversprechend.
Ergänzend hab ich mal kurz noch was zusammengewürfelt aus dem Autosaver 
Plugin von QGIS (arbeitet mit QTimer) .
Hier ist das Plugin zum Testen:
https://github.com/thbaumann/claas_temp/blob/main/__init__.py bzw. 
https://github.com/thbaumann/claas_temp/

Ein Intervall von 1 Sekunde fände ich schon sehr kurz und auch beim 
Gedanken, dass ein anderes Programm die dbf bearbeitet "stellen sich mir 
die Nackenhaare hoch" :-) aber so wie ich dich einschätze als Poweruser 
wirst du ja wissen, was du machst.
Weil man ja nicht auf den Layer selber gehen kann, sondern schauen muss, 
ob sich was an der Datei geändert hat kommt man wahrscheinlich um einen 
force reload nicht drumherum, was mit 1 sek Intervall auch krass wäre---
alles im Plugin eingebaut.
Also wie gesagt ein erster Wurf/Entwurf das Plugin und kein Anspruch auf 
eine perfekte Endlösung :-)
Grüße,
Thomas
------------------------

Ich habe die Anregung in mein Plugin eigebaut und das funktuioniert 
bestens. Im folgenden skizziert:

#Verwendet wird das Modul QTimer
from qgis.PyQt.QtCore import QTimer.

#Beim initiieren des Plugins unter def __init__(self, iface):
#wird eine Aktion für den Timer gestartet:

self.cron = QTimer()
self.cron.timeout.connect(self.cronEvent)

#Für meinen Aufruf unter def initGui(self) wird ein Icon angelegt:
# Baum aus  anzeigen
self.mas_TisyBaum =  QAction(QIcon ...., self.iface.mainWindow())
self.mas_TisyBaum.setEnabled(True)
self.mas_TisyBaum.setCheckable(True)
self.mas_TisyBaum.triggered.connect(self.tis_bau)
self.mas_TisyBaum_button = self.toolBar.addAction(self.mas_TisyBaum)

# das Icon ruft die Timer.Funktion auf
def tis_bau(self, checked):
	if checked:
		self.cron.start(4000)
         else:
		self.cron.stop()

# die eigentliche Funktion zum zoomen auf die Layer
def cronEvent(self):
   # Zunächst schauen ob es Werte mit 50 gibt
   vlayer = QgsProject.instance().mapLayersByName("Baeume")[0]
   vlayer.dataProvider().forceReload()
   qgis.utils.iface.setActiveLayer(vlayer)
   expr = QgsExpression('"M1"=50')
   it = vlayer.getFeatures( QgsFeatureRequest(expr) )
   anz = len(list(it))

   if anz > 0:   # wenn Werte mit 50 vorhanden sind diese wählen
     vlayer.selectByExpression('"M1"=50')
     objekte = vlayer.selectedFeatures()

     #Für jedes gewählte Objekt
     for objekt in objekte:
       # zoomen - weil es Punkte sind, einen Puffer von 30m erzeugen
       ob_geo = objekt.geometry()
       ob_geo_buf = ob_geo.buffer(30,5)
       geb = ob_geo_buf.boundingBox()
       qgis.utils.iface.mapCanvas().zoomToFeatureExtent(geb)
       qgis.utils.iface.mapCanvas().refresh()

       #Mit einer Box fragen, ob zum nächsten gezoomt werden soll 

        mb = QMessageBox()
        mb.setText('Nächster')
        mb.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
        return_value = mb.exec()

        # Den Eintrag 50 des gezeigten Baums löschen
        def loesch():
          feld_id = objekt.fields().indexOf('MERKER1')
          wert = None
          vlayer.startEditing()
          vlayer.changeAttributeValue(objekt.id(), feld_id, wert)
          vlayer.commitChanges()
          qgis.utils.iface.vectorLayerTools().stopEditing(vlayer)

        if return_value == QMessageBox.Ok:
          loesch()
          continue

        else:
          loesch()
          break
     else:
       pass

-------

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/


Mehr Informationen über die Mailingliste FOSSGIS-Talk-Liste