Поэтому я написал скрипт, который делает то, что я хочу, снова и снова, используя «while True:» в определенный промежуток времени (каждые 5 секунд, используя time.sleep (5)). Пока все хорошо, НО, когда я хочу остановить это, я просто не могу.
Я пробовал Control + C, Control + Break, Escape, и он практически игнорирует мою клавиатуру. Единственный способ остановить это - закрыть QGIS. Любые идеи? Кроме того, когда скрипт запускает time.sleep (5), QGIS отстает и зависает на 5 секунд, и я не могу, например, панорамировать слой, но я предполагаю, что это нормально.
Вот мой сценарий:
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)
Ответы:
QGIS предлагает вам всю мощь Python. Это открывает удивительные возможности, но также сопряжено с потенциальными подводными камнями. Что может привести к тому, что QGIS перестанет отвечать на запросы, заморозить или даже вызвать сбой. Использовать его с умом!
В вашем случае вместо того, чтобы отправлять основной поток в спящий режим на 5 секунд, лучше позволить QGIS делать что-то еще (например, прослушивание нажатий клавиш или нажатий кнопок) и публиковать событие таймера в цикле основного события, которое вернет элемент управления обратно. ваш сценарий 5 секунд спустя.
Вы можете использовать пример из этого ответа в качестве хорошей отправной точки. Чтобы остановить это, просто подключите какое-то событие к
stop()
слоту таймера.Или просто вызовите его вручную с консоли, когда вы думаете, что пришло время остановить его
Вы также можете установить eventFilter () в главном окне, чтобы перехватывать нажатия клавиш, если вам это нужно.
источник
В качестве обходного пути вы можете использовать виджет QT с кнопкой отмены.
Это немного грубо, но вот скрипт виджета, который я использовал:
Это может быть импортировано в ваш скрипт pyQgis (вам нужно добавить каталог в sys.path), а затем вы можете использовать переменную running, чтобы остановить цикл while:
источник