Suite

Arrêter le script PyQGIS qui a une boucle infinie, à l'aide du clavier ?


J'ai donc écrit un script qui fait ce que je veux encore et encore en utilisant un "while True:" dans un certain intervalle de temps (toutes les 5 secondes en utilisant time.sleep(5)). Jusqu'ici tout va bien, MAIS quand je veux l'arrêter, je ne peux pas.

J'ai essayé Control+C, Control+Break, Escape et il ignore pratiquement mon clavier. Le seul moyen de l'arrêter est de fermer QGIS. Des idées? De plus, lorsque le script atteint time.sleep(5), le type QGIS est en retard et se bloque pendant 5 secondes et je ne peux pas, par exemple, déplacer le calque mais je suppose que c'est normal.

Voici mon script :

de PyQt4.QtGui import * de PyQt4.QtCore import * de qgis.core import * de 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') pour la ligne dans txt.readlines() : pipeline.append(line.split()) print pipeline pipeline2=[] pour l'étiquette, la couleur dans pipeline : si "0" en couleur : pipeline2.append([label,"green"]) else : pipeline2.append([label,"red"]) print pipeline2 categories=[] pour label,color in pipeline2 : if ' rouge' en couleur : 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_lay euh) elatomatikoi= elatomatikoi[:-1] pour l'étiquette, la couleur dans le pipeline2 : si 'rouge' dans la couleur : QMessageBox.critical(None,"Avertissement",("Fuite au niveau du ou des tuyaux :%s
Vérifiez l'état du pipeline " %elatomatikoi)) pause txt.close() change_color() time.sleep(5)

QGIS vous offre toute la puissance de python. Cela ouvre des possibilités incroyables mais présente également des pièges potentiels. Ce qui peut empêcher QGIS de répondre, le bloquer ou même le planter. Fais-en bon usage!

Dans votre cas, au lieu d'envoyer le thread principal en veille pendant 5 secondes, vous feriez mieux de laisser QGIS faire autre chose (comme écouter vos frappes ou vos pressions sur les boutons) et publier un événement de minuterie dans la boucle d'événement principale qui rendra le contrôle à votre script 5 secondes plus tard.

Vous pouvez utiliser l'exemple de cette réponse comme un bon point de départ. Pour l'arrêter, il suffit de connecter un événement auarrêter()créneau de la minuterie.

def change_color() : print('Je suis maintenant rouge') timer = QTimer() timer.timeout.connect(change_color) timer.start(5000) someButton.clicked.connect(timer.stop)

Ou appelez-le simplement manuellement depuis la console lorsque vous pensez qu'il est temps de l'arrêter

timer.stop()

Vous pouvez également installer un eventFilter() sur la fenêtre principale pour intercepter les pressions sur les touches si vous en avez besoin.


Pour contourner ce problème, vous pouvez utiliser un widget QT avec un bouton d'annulation.

C'est un peu approximatif, mais voici le script de widget que j'ai utilisé :

from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 sauf AttributeError: def _fromUtf8(s): return s try: _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(con):, return text.disambim translate(context, text, disambig, _encoding) sauf AttributeError : def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig) class Ui_Form(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) self.setupUi(self) self.running = True def setupUi(self, Form): Form.setObjectName(_fromUtf8("Form")) Form.resize(100, 100) self.horizontalLayout_3 = QtGui.QHBoxLayout(Form) self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout_3")) self.Cancel QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.PushQt_buit ) self.Cancel_btn.setMinimumSize(QtCore.QSize(0, 0)) self.Cancel_btn.setMaximumSize(QtCore.QSize(425, 27)) self.Canc el_btn.setObjectName(_fromUtf8("Cancel_btn")) self.horizontalLayout.addWidget(self.Cancel_btn) self.horizontalLayout_3.addLayout(self.horizontalLayout) self.retranslateUi(Form) QtCore.QMetaObject.Nameself(connectSlotsBy) Formulaire) : Form.setWindowTitle(_translate("Form", "Annuler", Aucun)) self.Cancel_btn.setText(_translate("Form", "Annuler", Aucun)) self.Cancel_btn.clicked.connect(self.Annuler ) def Cancel(self): self.running = False

Cela peut être importé dans votre script pyQgis (vous devrez ajouter le répertoire à sys.path), puis vous pouvez utiliser la variable en cours d'exécution pour arrêter votre boucle while :

import sys sys.path.append("chemin/vers/annuler_widget") import cancel_widget btn = cancel_widget.Ui_Form() btn.show() pendant btn.running :…


Voir la vidéo: EBE OLie 28b2020-3-15 MK-ULTRA, TERRORIST - Ivana, ILona Podhrazska (Octobre 2021).