JaWeilBaum / pyqtlet2

pyqtlet2 extends pyqtlet which initially brought Leaflet maps to PyQt5 and PySide6.
Other
37 stars 19 forks source link

TypeError: Evented.runJavaScript() missing 1 required positional argument: 'mapWidgetIndex' #63

Closed CyBobber closed 6 months ago

CyBobber commented 6 months ago

Hi all, Since I upgraded my program from pyqtlet to pyqtlet2 I am getting a runJavaScript error like this:

TypeError: Evented.runJavaScript() missing 1 required positional argument: 'mapWidgetIndex'

As soon as I'm commenting the runJavaScript program lines, my program works fine. Could anyone please help to find out what I'm doing wrong. My QWidget class is embedded in a PyQt6 framework and is running without any others errors.

Here is my program:

import sys from qtpy.QtWidgets import QApplication, QVBoxLayout, QWidget from PyQt6.QtCore import from PyQt6.QtCore import Qt from .mapwidget import MapWidget from .leaflet import L from PyQt6 import QtCore, QtWidgets, QtWebEngineWidgets, QtWebChannel from PyQt6.QtWebEngineWidgets import from PyQt6.QtWebEngineWidgets import QWebEngineView from PyQt6.QtWebEngineCore import QWebEnginePage, QWebEngineProfile, QWebEngineScript, QWebEngineSettings

class gpsMap(QWidget):

def __init__(self, parent = None):
    QWidget.__init__(self, parent)

    self.mapWidget = MapWidget()
    self.layout = QVBoxLayout()
    self.layout.addWidget(self.mapWidget)
    self.profile = self.mapWidget._page.profile()
    self.profile.settings().setAttribute(QWebEngineSettings.WebAttribute.LocalContentCanAccessRemoteUrls,True)
    self.setLayout(self.layout)

    self.map = L.map(self.mapWidget)
    self.map.setView([51.5, 0], 10)
    L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png').addTo(self.map)

    self.marker = L.marker([51.5, 0]).addTo(self.map)
    self.marker = L.marker([51.6, 0],options={"opacity": 1, "draggable": 'true'})

    self.map.runJavaScript('var markerIcon = L.icon({iconUrl: "https://leafletjs.com/examples/custom-icons/leaf-red.png"});')
    self.map.runJavaScript(f'{self.marker.jsName}.setIcon(markerIcon);')

    with open("/web/modules/leaflet_pie/Pie.js") as f:
        self.map.runJavaScript(f.read())
        self.map.runJavaScript("L.pie([51.7, 0], [45, 55], options={radius: 10000, labels: false}).addTo(self.map)")

    self.show()

    self.map.clicked.connect(lambda x: print(x))

def keyPressEvent(self, event):
    if event.key() == Qt.Key.Key_Space:
        self.newMarker()

def newMarker(self):
    self.map.removeLayer(self.marker)
    self.marker = L.marker([47.13713, 7.24608])
    self.map.addLayer(self.marker)

def move(self, event):
    print('move', event)

def move_end(self, event):
    print('Move end', event["sender"].latLng)

def setZoomWarning(self, event):
    zoom = event['zoom']
    if zoom < 6:
        self.label.setText('Woah buddy. You\'re flying \
            pretty high. Hope you don\'t have vertigo..')
    else:
        self.label.setText('Yup, no worries. A fall from \
            here shoudn\'t hurt... too much.')

def setWarnings(self):
    self.map.getZoom(self.setZoomWarning)

Thank you yery much for your help and efforts in advance.

CyBobber commented 6 months ago

Hi all, After looking a little deeper in the source code of pyqtlet2, I found out, that the variable PapWidgetIndex is set to 0.

Therefore here two working examples: self.map.runJavaScript('var markerIcon = L.icon({iconUrl: "http://localhost:8080/images/marker-icon-red.png"})', 0) self.map.runJavaScript("L.control.zoomBox(options={addToZoomControl: 'true', modal: 'false', title: 'Zoom'}).addTo(self.map)", 0)

Hope that helps one or the other.

CyBobber commented 6 months ago

I'm sorry, should be mapWidgetIndex.