使用pyqtlet更新地图标记时出现初始化后注册新对象报错
问题原因
你当前的报错是「删除原有标记再新建标记」的实现逻辑导致的:pyqtlet底层会在页面初始化阶段完成所有Python对象和前端Leaflet JS对象的绑定,默认不支持运行时动态删除后再新增图层对象。旧标记删除后残留的无效引用会触发JS空指针报错,新创建的标记触发动态注册警告,就是你看到的Registered new object after initialization相关输出。
你要实现更新弹窗内容的需求,完全不需要修改标记本身,直接调用标记对象的setPopupContent()方法更新内容即可,不会触发任何报错。
修正后代码
仅需要修改更新逻辑即可,其余代码不需要调整:
import sys from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget from PyQt5.Qt import Qt from pyqtlet import L, MapWidget from time import time class MapWindow(QWidget): def __init__(self): # 初始化组件与布局 super().__init__() self.mapWidget = MapWidget() self.layout = QVBoxLayout() self.layout.addWidget(self.mapWidget) self.setLayout(self.layout) # pyqtlet地图相关配置 self.map = L.map(self.mapWidget) self.map.setView([12.97, 77.59], 10) L.tileLayer('https://{s}.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}{r}.png').addTo(self.map) self.marker = L.marker([12.934056, 77.610029]) self.marker.bindPopup('Maps are a treasure.') self.map.addLayer(self.marker) self.show() def keyPressEvent(self, event): if event.key() == Qt.Key_Space: self.updateMarkerPopup() def updateMarkerPopup(self): # 直接更新现有标记的弹窗内容,无需删除重建标记 self.marker.setPopupContent(str(time())) if __name__ == '__main__': app = QApplication(sys.argv) widget = MapWindow() sys.exit(app.exec_())
效果验证
修改后按下空格键,点击标记即可看到弹窗内容已经更新为最新时间戳,控制台不会再出现之前的报错信息。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

