从QWebView * Google Maps API运行JavaScript函数,PyQT *

时间:2015-01-31 15:17:55

标签: javascript python google-maps pyqt qwebview

我尝试编写一段代码,从数据库中读取经度和纬度,并将其传递给JavaScript函数,然后将JavaScript标记与已读取的坐标的经度和纬度相对应来自数据库。

将HTML设置为QWebView后,我使用:evaluateJavaScript尝试在JavaScript MarkersFromDatabase中运行该函数。

如您所见,我已修改QWebPage类以显示控制台错误消息,当我运行该程序时出现此错误:

  

ReferenceError:无法找到变量:MarkersFromDatabase 0 undefined

  1. 我不明白为什么我在运行某个功能时试图找到一个变量。

  2. 我不明白为什么这不能运行这个功能。

  3. 任何帮助将不胜感激。对不起凌乱的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)        
    

1 个答案:

答案 0 :(得分:2)

在尝试调用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")