Lebih banyak lagi

Menghentikan skrip PyQGIS yang mempunyai gelung tak terhingga, menggunakan papan kekunci?

Menghentikan skrip PyQGIS yang mempunyai gelung tak terhingga, menggunakan papan kekunci?


Oleh itu, saya menulis skrip yang melakukan apa yang saya mahukan berulang kali menggunakan "while True:" dalam selang waktu tertentu (setiap 5 saat menggunakan time.sleep (5)). Sejauh ini bagus, TAPI ketika saya mahu menghentikannya, saya tidak boleh.

Saya telah mencuba Control + C, Control + Break, Escape dan praktikalnya mengabaikan keyboard saya. Satu-satunya cara untuk menghentikannya adalah dengan menutup QGIS. Ada idea? Tambahan pula, apabila skrip mencecah masa.sleep (5) QGIS semacam ketinggalan dan membeku selama 5 saat dan saya tidak boleh, misalnya, menyapu lapisan tetapi saya menganggap ini normal.

Inilah skrip saya:

dari PyQt4.QtGui import * dari PyQt4.QtCore import * dari qgis.core import * dari qgis.utils mengimport iface import time manakala True: def change_color (): active_layer = iface.activeLayer () saluran paip = [] txt = open (' C: /users/stelios/desktop/project/Sensor.txt ',' r ') untuk baris dalam txt.readlines (): pipeline.append (line.split ()) print pipeline pipeline2 = [] untuk label, warna dalam saluran paip: jika "0" berwarna: pipeline2.append ([label, "hijau"]) lain-lain: pipeline2.append ([label, "red"]) mencetak saluran paip2 kategori = [] untuk label, warna dalam saluran paip2: jika ' merah 'dalam warna: elatomatikoi = elatomatikoi + label + "," simbol = QgsSymbolV2.defaultSymbol (active_layer.geometryType ()) symbol.setColor (QColor (color)) category = QgsRendererCategoryV2 (int (label), simbol, label) kategori. (kategori) ungkapan = 'id' penyaji = QgsCategorizedSymbolRendererV2 (ekspresi, kategori) active_layer.setRendererV2 (renderer) active_layer.setCacheImage (None) iface.mapCanvas (). refresh () iface.legendInterface (). refreshLayerSymbology (active_lay. er) elatomatikoi = elatomatikoi [: - 1] untuk label, warna dalam saluran paip2: jika 'merah' berwarna: QMessageBox.critical (Tiada, "Amaran", ("Kebocoran pada paip:% s  nPeriksa status saluran paip" % elatomatikoi)) break txt.close () change_color () time.sleep (5)

QGIS menawarkan kekuatan penuh python kepada anda. Ini membuka kemungkinan yang luar biasa tetapi juga dilengkapi dengan perangkap yang berpotensi. Yang boleh menjadikan QGIS tidak responsif, membekukan atau bahkan menghancurkannya. Gunakan dengan bijak!

Dalam kes anda, bukannya menghantar utas utama tidur selama 5 saat, lebih baik membiarkan QGIS melakukan perkara lain (seperti mendengar ketukan kekunci atau menekan butang) dan menghantar acara pemasa ke gelung acara utama yang akan mengembalikan kawalan ke skrip anda 5 saat kemudian.

Anda boleh menggunakan contoh dari jawapan ini sebagai titik permulaan yang baik. Untuk menghentikannya, sambungkan beberapa acara keberhenti ()slot pemasa.

def change_color (): print ('Saya sekarang merah') timer = QTimer () timer.timeout.connect (change_color) timer.start (5000) someButton.clicked.connect (timer.stop)

Atau panggil secara manual dari konsol apabila anda fikir sudah tiba masanya untuk menghentikannya

timer.stop ()

Anda juga boleh memasang eventFilter () pada tetingkap utama untuk memintas penekanan kekunci jika anda memerlukannya.


Sebagai penyelesaian, anda boleh menggunakan widget QT dengan butang batal.

Agak kasar, tetapi inilah skrip widget yang telah saya gunakan:

dari PyQt4 import QtCore, QtGui cuba: _fromUtf8 = QtCore.QString.fromUtf8 kecuali AttributeError: def _fromUtf8 (s): return s try: _encoding = QtGui.QApplication.UnicodeUTF8 def _translate (konteks, text, text, teks, teks terjemahkan (konteks, teks, disambig, _encoding) kecuali AttributeError: def _translate (konteks, teks, disambig): return QtGui.QApplication.translate (konteks, teks, disambig) kelas Ui_Form (QtGui.QWidget): def __init __ (diri): def 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) self.Cancel_btn.setMinimumSize (QtCore.QSize (0, 0)) self.Cancel_btn.setMaximumSize (QtCore.QSize (425, 27)) diri.Canc el_btn.setObjectName (_fromUtf8 ("Cancel_btn")) self.horizontalLayout.addWidget (self.Cancel_btn) self.horizontalLayout_3.addLayout (self.horizontalLayout) self.retranslateUi (Form) QtConContan Form): Form.setWindowTitle (_translate ("Form", "Cancel", None)) self.Cancel_btn.setText (_translate ("Form", "Cancel", None)) diri.Cancel_btn.clicked.connect (self.Cancel ) def Cancel (self): self.running = Salah

Ini boleh diimport ke skrip pyQgis anda (anda harus menambahkan direktori ke sys.path) dan kemudian anda boleh menggunakan pemboleh ubah yang sedang berjalan untuk menghentikan loop sementara anda:

import sys sys.path.append ("path / to / cancel_widget") import cancel_widget btn = cancel_widget.Ui_Form () btn.show () sambil btn.running:…

Tonton videonya: QGIS Python PyQGIS - Show Error, Warning, and Success Messages