- Создает слой
- Запустите запрос HTTP GET для получения новых координат (по умолчанию выполняется асинхронно)
- Используйте эти координаты для рисования маркера на слое (сначала удаляется старый маркер) , на самом деле он должен выполняться в основном потоке)
Что я нашел/пробовал на данный момент:
- time.sleep() (как предложено здесь) полностью замораживает QGIS.
- schedПланировщик по какой-то причине не ждет (см. код ниже) и печатает «test!» сразу после «повтора» (даже если я использую задержку в 60 секунд).
- threading.Timer каждый раз будет запускать новый поток (и вы не сможете остановить цикл), поэтому в ответе не рекомендуется его использовать - из-за этого непроверено.
- Я не могу использовать Tkinter, потому что Python QGIS его не поддерживает.
Мой код:< /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