J'ai donc écrit un script qui fait ce que je veux encore et encore en utilisant un "while True:" dans un certain intervalle de temps (toutes les 5 secondes en utilisant time.sleep (5)). Jusqu'ici tout va bien, MAIS quand je veux l'arrêter, je ne peux pas.
J'ai essayé Control + C, Control + Break, Escape et il ignore pratiquement mon clavier. La seule façon de l'arrêter est de fermer QGIS. Des idées? De plus, lorsque le script frappe time.sleep (5), QGIS se retire et se fige pendant 5 secondes et je ne peux pas, par exemple, effectuer un panoramique sur la couche, mais je suppose que c'est normal.
Voici mon script:
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from qgis.core import *
from qgis.utils import iface
import time
while True:
def change_color():
active_layer = iface.activeLayer()
pipeline=[]
txt=open('C:/users/stelios/desktop/project/Sensor.txt','r')
for line in txt.readlines():
pipeline.append(line.split())
print pipeline
pipeline2=[]
for label,color in pipeline:
if "0" in color:
pipeline2.append([label,"green"])
else:
pipeline2.append([label,"red"])
print pipeline2
elatomatikoi=""
categories=[]
for label,color in pipeline2:
if 'red' in color:
elatomatikoi=elatomatikoi + label+","
symbol = QgsSymbolV2.defaultSymbol(active_layer.geometryType())
symbol.setColor(QColor(color))
category = QgsRendererCategoryV2(int(label), symbol, label)
categories.append(category)
expression = 'id'
renderer = QgsCategorizedSymbolRendererV2(expression, categories)
active_layer.setRendererV2(renderer)
active_layer.setCacheImage(None)
iface.mapCanvas().refresh()
iface.legendInterface().refreshLayerSymbology(active_layer)
elatomatikoi= elatomatikoi[:-1]
for label,color in pipeline2:
if 'red' in color:
QMessageBox.critical(None,"Warning",("Leakage at pipe(s):%s\nCheck Pipeline status " %elatomatikoi))
break
txt.close()
change_color()
time.sleep(5)
Réponses:
QGIS vous offre toute la puissance de python. Cela ouvre des possibilités incroyables mais comporte également des pièges potentiels. Ce qui peut rendre QGIS insensible, le geler ou même le planter. Fais-en bon usage!
Dans votre cas, au lieu d'envoyer le thread principal en veille pendant 5 secondes, vous feriez mieux de laisser QGIS faire autre chose (comme écouter vos frappes au clavier ou appuyer sur les boutons) et publier un événement de minuterie dans la boucle d'événement principal qui rendra le contrôle à votre script 5 secondes plus tard.
Vous pouvez utiliser l'exemple de cette réponse comme un bon point de départ. Pour l'arrêter, connectez simplement un événement à l'
stop()
emplacement du minuteur.Ou appelez-le simplement manuellement depuis la console lorsque vous pensez qu'il est temps de l'arrêter
Vous pouvez également installer un eventFilter () sur la fenêtre principale pour intercepter les pressions de touches si vous en avez besoin.
la source
Pour contourner ce problème, vous pouvez utiliser un widget QT avec un bouton d'annulation.
C'est un peu difficile, mais voici le script de widget que j'ai utilisé:
Cela peut être importé dans votre script pyQgis (vous devrez ajouter le répertoire à sys.path) puis vous pouvez utiliser la variable en cours d'exécution pour arrêter votre boucle while:
la source