簡體   English   中英

從QWebView * Google Maps API運行JavaScript函數,PyQT *

[英]Running a JavaScript Function From QWebView *Google Maps API, PyQT*

我正在嘗試編寫一段代碼,該代碼從數據庫中讀取經度和緯度,並將其傳遞給JavaScript函數,然后將JavaScript標記與已從數據庫中讀取的坐標的經度和緯度相對應。

將HTML設置為QWebView后,我使用:evaluateJavaScript嘗試在JavaScript MarkersFromDatabase中運行該函數。

如您所見,我已修改QWebPage類以顯示控制台錯誤消息,當我運行該程序時,我收到此錯誤:

ReferenceError:找不到變量:MarkersFromDatabase 0 undefined

  1. 我不明白為什么我在運行一個函數時試圖找到一個變量。

  2. 我不明白為什么這不運行該功能。

任何幫助,將不勝感激。 對不起凌亂的JavaScript格式!

完整代碼:

from PyQt4.QtWebKit import *
import sqlite3
from PyQt4.QtSql import *

class CustomQWebPage(QWebPage):
    def __init__(self):
        super().__init__()

    def javaScriptConsoleMessage(self,message,lineNumber,sourceID):
        print(message,lineNumber,sourceID)
        print("javascript console message^")

class ViewOnlyMap(QWebView):


    def __init__(self, parent=None):
        super().__init__()
        self.settings().setAttribute(QWebSettings.JavascriptEnabled, True)
        self.settings().setAttribute(QWebSettings.JavascriptCanOpenWindows, True)
        self.settings().setAttribute(QWebSettings.JavascriptCanAccessClipboard, True)
        self.settings().setAttribute(QWebSettings.DeveloperExtrasEnabled, True)
        self.CustomPage=CustomQWebPage()
        self.Coordinates=None

        self.set_code()
        self.get_marker_coordinates()



    def get_marker_coordinates(self):
        with sqlite3.connect("skateboard_progress_tracker.db") as db:
            cursor=db.cursor()
            sql="select SkateparkLongitude, SkateparkLatitude from Skatepark"
            cursor.execute(sql)
            self.Coordinates=cursor.fetchall()
        for coordinate in self.Coordinates:
            self.CustomPage.mainFrame().evaluateJavaScript('MarkersFromDatabase({0},{1})'.format(coordinate[0],coordinate[1]))

            print("Marker added")
            print(coordinate[0])
            print(coordinate[1])








    def set_code(self):

        self.html='''<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <title>Simple markers</title>
    <style>
      html, body, #map-canvas {
        height: 100%;
        width: 100%
        margin: 0px;
        padding: 0px
      }
    </style>
    <script src="https://maps.googleapis.com/maps/api/js?v=3.exp"></script>
    <script>

        var map;
        var markers = [];
        var results = [];
        var coords = [];
        var highestLevel;


        function initialize() {


        var Centre = new google.maps.LatLng(52.20255705185695,0.1373291015625);
        var mapOptions = {
        zoom: 8,
        minZoom: 3,
        center: Centre,
        }
        map = new google.maps.Map(document.getElementById('map-canvas'),mapOptions);

        google.maps.event.addListener(map, 'click', function(event) {
        AddMarker(event.latLng);
        });

         }


         function MarkersFromDatabase(SkateparkLat,SkateparkLng) {
        var Skatepark = new google.maps.LatLng(SkateparkLat,SkateparkLng);
        //return Skatepark;

        AddMarker(Skatepark); }




        function AddMarker(location) {


        var marker = new google.maps.Marker({
        title: 'Test',
        position: location,
        animation: google.maps.Animation.DROP,
        map: map

        });
        //markers.push(marker);
        var lat = marker.getPosition().lat();
        var lng = marker.getPosition().lng();
        markers.push({"Object":marker,"Lat":lat,"Lng":lng});

                var contentString = '<div id="content">'+
      '<div id="siteNotice">'+
      '</div>'+
      '<h1 id="firstHeading" class="firstHeading">Skatepark</h1>'+
      '<div id="bodyContent">'+
      '<p>A skatepark description </p>'+
      '</div>'+
      '</div>';

      var infowindow = new google.maps.InfoWindow({
      content: contentString
  });

      google.maps.event.addListener(marker, 'rightclick', function(event) {
        marker.setMap(null);
        });
    google.maps.event.addListener(marker, 'mouseover', function(event) {
    infowindow.open(map,marker);
  });
       }


function GetMarkers(){
     return markers;
        }


google.maps.event.addDomListener(window, 'load', initialize);
    </script>
  </head>
  <body>
    <div id="map-canvas"></div>
  </body>
</html> '''
        self.setHtml(self.html)        

在嘗試調用javascript函數之前,您需要為網頁提供加載的機會。 所以為loadFinished信號添加一個處理程序:

class ViewOnlyMap(QWebView):
    def __init__(self, parent=None):
        super().__init__()
        ...
        self.setPage(self.CustomPage)
        self.loadFinished.connect(self.handleLoadFinished)
        self.set_code()

    def handleLoadFinished(self, ok):
        if ok:
            print("Page loaded successfully")
            self.get_marker_coordinates()
        else:
            print("Could not load page")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM