Então, escrevi um script que faz o que eu quero repetidamente, usando um "while True:" em um determinado intervalo de tempo (a cada 5 segundos usando time.sleep (5)). Até aí tudo bem, mas quando eu quero parar, eu simplesmente não posso.
Eu tentei Control + C, Control + Break, Escape e praticamente ignora meu teclado. A única maneira de impedir isso é fechar o QGIS. Alguma ideia? Além disso, quando o script atinge time.sleep (5), o tipo de QGIS fica lento e congela por 5 segundos e não posso, por exemplo, movimentar a camada, mas presumo que isso seja normal.
Aqui está o meu 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)
Respostas:
O QGIS oferece todo o poder do python para você. Isso abre possibilidades surpreendentes, mas também vem com possíveis armadilhas. O que pode deixar o QGIS sem resposta, congelar ou até travá-lo. Use-o com sabedoria!
No seu caso, em vez de enviar o encadeamento principal para suspensão por 5 segundos, é melhor deixar o QGIS fazer outra coisa (como ouvir as teclas pressionadas ou pressionar os botões) e postar um evento de timer no loop do evento principal que retornará o controle para seu script 5 segundos depois.
Você pode usar o exemplo desta resposta como um bom ponto de partida. Para pará-lo, basta conectar algum evento ao
stop()
slot do timer.Ou simplesmente chame-o manualmente no console quando achar que é hora de pará-lo
Você também pode instalar um eventFilter () na janela principal para interceptar pressionamentos de tecla, se necessário.
fonte
Como alternativa, você pode usar um widget QT com um botão Cancelar.
É um pouco difícil, mas aqui está o script de widget que eu usei:
Isso pode ser importado para o script pyQgis (você precisará anexar o diretório ao sys.path) e, em seguida, você pode usar a variável running para interromper o loop while:
fonte