2015-01-31 4 views
3

에서 JavaScript 기능 실행 데이터베이스에서 위도와 경도를 읽고이를 JavaScript 함수에 전달하여 다음과 일치하는 마커를 배치하는 코드를 작성하려고합니다. 데이터베이스에서 읽은 좌표의 경도와 위도.QWebView * Google Maps API, PyQT *

HTML을 QWebView로 설정 한 후 evaluateJavaScript를 사용하여 JavaScript MarkersFromDatabase에서 함수를 실행하려고 시도합니다.

당신은 내가 콘솔 오류 메시지가 표시 QWebPage 클래스를 수정하고 난이 프로그램을 실행할 때이 오류가 얻을 볼 수 있듯이 : 그것은하려고 왜

ReferenceError: Can't find variable: MarkersFromDatabase 0 undefined

  1. 가 이해가 안가 함수를 실행할 때 변수를 찾습니다.

  2. 이 기능을 실행하지 않는 이유를 알 수 없습니다.

어떤 도움을 주시면 감사하겠습니다. 지저분한 자바 스크립트 형식을 사용하여 죄송합니다!

전체 코드 :

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)   

답변

2

당신은 웹 페이지를 자바 스크립트 함수를 호출하기 전에로드 할 수있는 기회를 제공해야합니다. 그래서 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") 
+0

안녕하세요, 나를 위해 일하지 :( 를 파이썬 유휴에 나는 여전히 메시지를 얻을 : 오류 ReferenceError : 변수를 찾을 수 없습니다를 : MarkersFromDatabase 0 undefined 마커는 여전히지도에 표시되지 않습니다 ... – PythonBen

+0

@PythonBen 웹보기에서 페이지를 설정하는 것을 잊었습니다 (업데이트 된 예제 코드 참조). 여전히 ' 하지만 – ekhumoro

+0

이것은 파이썬 콘솔에서 오류를 멈추었지만 위치는 마커를 얻지 못합니다. 'retur'를 사용했기 때문에 올바르게 실행되고 있습니다. JavaScript AddMarker 함수의 끝에 "n location; 그리고 나서 evaluateJavaScript 라인을 인쇄하고 내가 넣고 있던 좌표를 얻었습니다. 그리고지도를 클릭 할 때마다 AddMarker 함수를 실행하고 마커를 추가합니다. 지금까지 도와 줘서 고마워! – PythonBen