使用 Javascript 传递参数 - Python 到 HTML

Passing parameters - Python to HTML with Javascript

我有一个简单的 Python 文件,它使用 QtWebkit.QWebView 显示 google 地图页面。

这是通过调用 HTML 完成的,其中包含一些 java 脚本。

我不知道如何从 Python 获取坐标到 HTML 文件中的 java 脚本。

也许有人能给我指出正确的方向?

PYTHON:

class MainWin(QDialog,MainFrm.Ui_MainWin):
    def __init__(self, parent=None):
        super(MainWin,self).__init__(parent)
        self.setupUi(self)


        self.lat = -25.723146
        self.long = 28.267628
        self.GMapWidget.load("markers.html?",coords = self.lat)



app = QApplication(sys.argv)
frm=MainWin()
frm.show()
app.exec_()

HTML:

<!DOCTYPE html>
<html>
  <head>
    <style type="text/css">
      html, body, #map-canvas { height: 100%; margin: 0; padding: 0;}
    </style>
    <script type="text/javascript"
      src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCrRTR8nZX3m6g_nYbilamyKSBHx9QUdfw">
    </script>
    <!DOCTYPE html>
<html>
  <head>
    <style type="text/css">
      html, body, #map-canvas { height: 100%; margin: 0; padding: 0;}
    </style>
    <script type="text/javascript"
      src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCrRTR8nZX3m6g_nYbilamyKSBHx9QUdfw">
    </script>
    <script type="text/javascript">
      lt = -25.723146
      ln = 28.267628
      function initialize() {
        var mapOptions = {
          center: { lat: lt, lng:  ln},
          zoom: 8
        };
        var map = new google.maps.Map(document.getElementById('map-canvas'),
            mapOptions);
      }
      google.maps.event.addDomListener(window, 'load', initialize);

    </script>
  </head>
  <body>
<div id="map-canvas"></div>
  </body>
</html>
  </head>
  <body>
<div id="map-canvas"></div>
  </body>
</html>

如果您确实需要 Python 应用程序和 JavaScript 应用程序之间的实时事件通信系统,您可以在两者之间建立 SSE 或 WebSocket 连接。不过,我不确定您是否想要这种额外的复杂性。

如果静态(一次性)参数交换就足够了,您可以使用模板。使用 ltln 值的占位符从 HTML 文件制作模板。 stdlib 中的 string.Template 在这里很有用。

模板文件(例如 "markers.html.tpl")的内容可能如下所示:

[...]
<script type="text/javascript">
  lt = $latitude
  ln = $longitude 
[...]

而不是简单地加载 HTML 文件:

self.GMapWidget.load("markers.html?",coords = self.lat)

您首先阅读模板,插入值,写入新的 HTML 文件,然后才加载小部件:

from tempfile import NamedTemporaryFile
from string import Template


with open("markers.html.tpl", "rb") as f:
    tpl = Template(f.read().decode("utf-8"))

htmlcontent = tpl.substitute(latitude=1.2, longitude=2.5)

with NamedTemporaryFile() as f:
    f.write(htmlcontent.encode("utf-8")
    self.GMapWidget.load(f.name)

这是一种幼稚但可靠的方法。请注意,您不能重复使用模板,因此 tpl = Template(f.read().decode("utf-8")) 只需要一次,但可以根据需要进行多次 tpl.substitute() 调用。

除此之外,我不知道 Python 代码和 WebKit 组件之间有任何特定的接口,因为您使用 JavaScript 变量的状态动态地 fiddle。