Entonces escribí un script que hace lo que quiero una y otra vez usando un "while True:" en un cierto intervalo de tiempo (cada 5 segundos usando time.sleep (5)). Hasta ahora todo bien, PERO cuando quiero detenerlo simplemente no puedo.
He intentado Control + C, Control + Break, Escape y prácticamente ignora mi teclado. La única forma de detenerlo es cerrar QGIS. ¿Algunas ideas? Además, cuando el script llega a time.sleep (5), QGIS se retrasa y se congela durante 5 segundos y no puedo, por ejemplo, desplazar la capa, pero supongo que esto es normal.
Aquí está mi guión:
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)
Respuestas:
QGIS le ofrece todo el poder de Python. Esto abre posibilidades increíbles, pero también conlleva posibles dificultades. Lo que puede hacer que QGIS no responda, se congele o incluso se bloquee. ¡Úsalo con sabiduría!
En su caso, en lugar de enviar el hilo principal a dormir durante 5 segundos, es mejor dejar que QGIS haga algo más (como escuchar las pulsaciones de teclas o presionar botones) y publicar un evento de temporizador en el bucle de eventos principal que devolverá el control a su guión 5 segundos después.
Puede usar el ejemplo de esta respuesta como un buen punto de partida. Para detenerlo, simplemente conecte algún evento a la
stop()
ranura del temporizador.O simplemente llámalo manualmente desde la consola cuando creas que es hora de detenerlo
También puede instalar un eventFilter () en la ventana principal para interceptar las pulsaciones de teclas si lo necesita.
fuente
Como solución alternativa, puede usar un widget QT con un botón cancelar.
Es un poco difícil, pero aquí está el script de widget que he usado:
Esto puede importarse a su script pyQgis (deberá agregar el directorio a sys.path) y luego puede usar la variable en ejecución para detener su ciclo while:
fuente