【问题标题】:Passing parameters - Python to HTML with Javascript传递参数 - 使用 Javascript 的 Python 到 HTML
【发布时间】:2015-04-13 10:17:06
【问题描述】:

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

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

我不知道如何从 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>

【问题讨论】:

    标签: java python html parameter-passing


    【解决方案1】:

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

    如果静态(一次性)参数交换就足够了,您可以使用模板。从您的 HTML 文件中创建一个模板,其中包含 ltln 值的占位符。标准库中的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 变量的状态。

    【讨论】:

    • 非常感谢您的意见。它对我帮助很大。我只是在加载文件时遇到了问题。它导致了以下错误 QNetworkAccessFileBackendFactory: URL has no schema set, use file:// for files.
    • 但通过使用 setHtml 解决了这个问题 - 再次感谢
    • 很高兴有帮助!这确实是您需要一些技术概述来提出解决方案的问题之一。我很确定其他人可能会提出不同的方法,但我提出的概念非常扎实。请记住:您可以接受带有绿色复选标记的答案——这对我和其他人都有帮助!
    猜你喜欢
    • 2012-10-16
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    相关资源
    最近更新 更多