Jadi saya menulis sebuah skrip yang melakukan apa yang saya inginkan berulang-ulang menggunakan "while True:" dalam interval waktu tertentu (setiap 5 detik menggunakan time.sleep (5)). Sejauh ini bagus, TAPI ketika saya ingin menghentikannya, saya tidak bisa.
Saya telah mencoba Control + C, Control + Break, Escape dan praktis mengabaikan keyboard saya. Satu-satunya cara untuk menghentikannya adalah dengan menutup QGIS. Ada ide? Selanjutnya, ketika skrip hits time.sleep (5) QGIS agak tertinggal dan membeku selama 5 detik dan saya tidak bisa, misalnya, menggeser lapisan tetapi saya menganggap ini normal.
Ini skrip saya:
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)
Jawaban:
QGIS menawarkan kekuatan penuh python untuk Anda. Ini membuka kemungkinan luar biasa tetapi juga dilengkapi dengan jebakan potensial. Yang mungkin membuat QGIS tidak responsif, membeku atau bahkan menabraknya. Gunakan dengan bijak!
Dalam kasus Anda, alih-alih mengirim utas ke mode tidur selama 5 detik, Anda lebih baik membiarkan QGIS melakukan sesuatu yang lain (seperti mendengarkan penekanan tombol atau penekanan tombol) dan memposting acara penghitung waktu ke loop acara utama yang akan mengembalikan kontrol ke skrip Anda 5 detik kemudian.
Anda dapat menggunakan contoh dari jawaban ini sebagai titik awal yang baik. Untuk menghentikannya, cukup sambungkan beberapa acara ke
stop()
slot timer.Atau panggil saja secara manual dari konsol ketika Anda berpikir sudah waktunya untuk menghentikannya
Anda juga dapat menginstal eventFilter () di jendela utama untuk mencegat penekanan tombol jika Anda membutuhkannya.
sumber
Saat bekerja, Anda dapat menggunakan widget QT dengan tombol batal.
Agak kasar, tapi ini skrip widget yang saya gunakan:
Ini dapat diimpor ke skrip pyQgis Anda (Anda harus menambahkan direktori ke sys.path) dan kemudian Anda dapat menggunakan variabel yang berjalan untuk menghentikan loop while Anda:
sumber