Also habe ich ein Skript geschrieben, das in einem bestimmten Zeitintervall (alle 5 Sekunden mit time.sleep (5)) immer wieder mit einem "while True:" macht, was ich will. So weit so gut, ABER wenn ich damit aufhören will, kann ich es einfach nicht.
Ich habe Strg + C, Strg + Pause, Escape ausprobiert und meine Tastatur wird praktisch ignoriert. Die einzige Möglichkeit, dies zu stoppen, besteht darin, QGIS zu schließen. Irgendwelche Ideen? Wenn das Skript auf time.sleep (5) trifft, verzögert sich QGIS und friert 5 Sekunden lang ein, und ich kann beispielsweise die Ebene nicht schwenken, aber ich gehe davon aus, dass dies normal ist.
Hier ist mein Skript:
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)
Antworten:
QGIS bietet Ihnen die volle Leistung von Python. Dies eröffnet erstaunliche Möglichkeiten, birgt aber auch potenzielle Fallstricke. Dies kann dazu führen, dass QGIS nicht mehr reagiert, einfriert oder sogar abstürzt. Benutze es weise!
In Ihrem Fall sollten Sie QGIS lieber etwas anderes tun lassen (z. B. Ihre Tastenanschläge oder Tastendrücke abhören), anstatt den Haupt-Thread für 5 Sekunden in den Ruhezustand zu versetzen, und ein Timer-Ereignis an die Hauptereignisschleife senden, an die die Steuerung zurückgegeben wird Ihr Skript 5 Sekunden später.
Sie können das Beispiel aus dieser Antwort als guten Ausgangspunkt verwenden. Um es zu stoppen, verbinden Sie einfach ein Ereignis mit dem
stop()
Steckplatz des Timers.Oder rufen Sie es einfach manuell von der Konsole aus auf, wenn Sie glauben, dass es Zeit ist, es zu stoppen
Sie können auch einen eventFilter () im Hauptfenster installieren , um bei Bedarf Tastendrücke abzufangen.
quelle
Als Workaround können Sie ein QT-Widget mit einer Abbrechen-Schaltfläche verwenden.
Es ist ein bisschen rau, aber hier ist das Widget-Skript, das ich verwendet habe:
Dies kann in Ihr pyQgis-Skript importiert werden (Sie müssen das Verzeichnis an sys.path anhängen) und dann können Sie die laufende Variable verwenden, um Ihre while-Schleife zu stoppen:
quelle