Napisałem więc skrypt, który robi to, co chcę w kółko, używając „while True:” w określonym przedziale czasu (co 5 sekund przy użyciu time.sleep (5)). Jak dotąd tak dobrze, ALE kiedy chcę to zatrzymać, po prostu nie mogę.
Próbowałem Control + C, Control + Break, Escape i praktycznie ignoruje moją klawiaturę. Jedynym sposobem, aby to zatrzymać, jest zamknięcie QGIS. Jakieś pomysły? Ponadto, gdy skrypt uderza w time.sleep (5), QGIS rodzi opóźnienia i zawiesza się na 5 sekund i nie mogę na przykład przesuwać warstwy, ale zakładam, że jest to normalne.
Oto mój skrypt:
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)
Odpowiedzi:
QGIS oferuje pełną moc Pythona. Otwiera to niesamowite możliwości, ale wiąże się także z potencjalnymi pułapkami. Co może spowodować, że QGIS przestanie odpowiadać, zawiesi się, a nawet zawiesi. Używać go mądrze!
W twoim przypadku zamiast wysyłać główny wątek do uśpienia na 5 sekund, lepiej pozwól QGIS zrobić coś innego (np. Słuchanie naciśnięć klawiszy lub naciśnięć przycisków) i opublikować zdarzenie timera w głównej pętli zdarzeń, które przekaże sterowanie z powrotem do twój skrypt 5 sekund później.
Możesz użyć przykładu z tej odpowiedzi jako dobrego punktu wyjścia. Aby go zatrzymać, po prostu podłącz jakieś zdarzenie do
stop()
gniazda timera.Lub po prostu wywołaj go ręcznie z konsoli, jeśli uważasz, że nadszedł czas, aby go zatrzymać
Możesz także zainstalować eventFilter () w głównym oknie, aby przechwytywać naciśnięcia klawiszy, jeśli potrzebujesz.
źródło
Aby obejść ten problem, możesz użyć widgetu QT z przyciskiem anulowania.
To trochę trudne, ale oto skrypt widgetu, którego użyłem:
Można to zaimportować do skryptu pyQgis (musisz dołączyć katalog do sys.path), a następnie możesz użyć działającej zmiennej, aby zatrzymać pętlę while:
źródło