使用 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 连接。不过,我不确定您是否想要这种额外的复杂性。
如果静态(一次性)参数交换就足够了,您可以使用模板。使用 lt
和 ln
值的占位符从 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。
我有一个简单的 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 连接。不过,我不确定您是否想要这种额外的复杂性。
如果静态(一次性)参数交换就足够了,您可以使用模板。使用 lt
和 ln
值的占位符从 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。