Изменяйте слой QGIS каждые/через ~5 секунд (не блокируя основной поток)Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Изменяйте слой QGIS каждые/через ~5 секунд (не блокируя основной поток)

Сообщение Anonymous »

Я написал скрипт Python для QGIS 3.36.2 (использует Python 3.12.3), который выполняет следующие действия:
  • Создает слой
  • Запустите запрос HTTP GET для получения новых координат (по умолчанию выполняется асинхронно)
  • Используйте эти координаты для рисования маркера на слое (сначала удаляется старый маркер) , на самом деле он должен выполняться в основном потоке)
Шаг 1 выполняется только один раз. 2. + 3. должен работать бесконечно, но останавливаться, если возникает ошибка или пользователь останавливает сценарий. Для тестирования я хочу запустить его, например. 10 раз.
Что я нашел/пробовал на данный момент:
  • time.sleep() (как предложено здесь) полностью замораживает QGIS.
  • schedПланировщик по какой-то причине не ждет (см. код ниже) и печатает «test!» сразу после «повтора» (даже если я использую задержку в 60 секунд).
  • threading.Timer каждый раз будет запускать новый поток (и вы не сможете остановить цикл), поэтому в ответе не рекомендуется его использовать - из-за этого непроверено.
  • Я не могу использовать Tkinter, потому что Python QGIS его не поддерживает.
Как повторить шаги 2 и 3 несколько раз, если нет ошибок, например. Через 5 секунд после завершения последней итерации, не блокируя графический интерфейс (особенно средство просмотра карт) в режиме сна и желательно без использования каких-либо дополнительных библиотек?
Мой код:< /p>
#imports here
class ArrowDrawerClass:
layer = None
dataprovider = None
feature = None
repeat = True
url = "someURL"
repeatCounter = 0
myscheduler = sched.scheduler(time.time,time.sleep)

def __init__(self):
self.createNewLayer()

def createNewLayer(self):
layername = "ArrowLayer"
self.layer = QgsVectorLayer('Point', layername, "memory")
self.dataprovider = self.layer.dataProvider()
self.feature = QgsFeature()
#Set symbol, color,... of layer here
QgsProject.instance().addMapLayers([self.layer])

def doRequest(self):
request = QNetworkRequest(QUrl(self.url))
request.setTransferTimeout(10000) #10s
self.manager = QNetworkAccessManager()
self.manager.finished.connect(self.handleResponse)
self.manager.get(request)

def handleResponse(self, reply):
err = reply.error()

if err == QtNetwork.QNetworkReply.NetworkError.NoError:
bytes = reply.readAll()
replytext = str(bytes, 'utf-8').strip()
#extract coordinates here ...
self.drawArrow(x,y)
else:
self.displayError(str(err),reply.errorString())

def drawArrow(self,x,y):
self.layer.dataProvider().truncate() #removes old marker
point1 = QgsPointXY(x,y)
self.feature.setGeometry(QgsGeometry.fromPointXY(point1))
self.dataprovider.addFeatures([self.feature])
self.layer.updateExtents()
self.layer.triggerRepaint()
self.repeatCounter += 1
self.repeatEverything()

def displayError(self,code,msg):
self.repeat = False
#show error dialog here

def start(self):
self.myscheduler.enter(0,0,self.doRequest())
self.myscheduler.run()

def repeatEverything(self):
print("counter:",self.repeatCounter)
if self.repeat and self.repeatCounter

Подробнее здесь: https://stackoverflow.com/questions/786 ... ain-thread
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»