[英]evaluateJavaScript in PyQt - function is not called
我对PyQt / Webview有问题。 困扰我的代码应该呈现图表,但事实并非如此。 我正在使用Highcharts框架,并为通过Python呈现图表的javascript函数提供数据。 我还检查了webview是否准备就绪,因为那是我的先前错误。 有问题的代码如下所示:
command = ('loadPinch(' + str(random.sample(range(10000), 1000)) +
', ' + str(['2009', '01', '01']) + ');')
self.webview.page().mainFrame().evaluateJavaScript("""
var readyStateCheckInterval = setInterval(function() {
if(document.readyState === 'complete'){ """ +
command + """
clearInterval(readyStateCheckInterval);
}
}, 10);""")
loadPinch是一个JavaScript函数,看起来与此类似(反过来又类似于Highcharts示例图):
function loadPinch(data, date){
$('#container').highcharts({
chart: {
zoomType: 'x',
spacingRight: 20
},
title: {text: 'Twitter Trends'},
subtitle: {
text: document.ontouchstart === undefined ?
'Click and drag in the plot area to zoom in' :
'Pinch the chart to zoom in'
},
xAxis: {
type: 'datetime',
maxZoom: 10 * 24 * 3600000,
title: {text: null}
},
yAxis: {
title: {text: 'Occurence'}
},
tooltip: {shared: true},
legend: {enabled: false},
plotOptions: {
area: {
fillColor: {
linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1},
stops: [
[0, Highcharts.getOptions().colors[0]],
[1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]
]
},
lineWidth: 1,
marker: {enabled: false},
shadow: false,
states: {hover: {lineWidth: 1}},
threshold: null
}
},
series: [{
type: 'area',
name: 'Twitter Trend',
pointInterval: 24 * 3600 * 1000,
pointStart: Date.UTC(date[0], date[1], date[2]),
data: data
}]
});
};
我可能会告诉你,如果我打印命令,将评估JavaScript交给控制台,而不是执行并将其粘贴到开发者控制台,它将按预期执行并呈现图表,这使我相信某种我无法追踪的种族状况
有人知道可能是什么问题吗?
问候,卡森
注意:问题仍然存在。
我终于找到了解决办法; 我在JS方面想的太多了。
页面加载完成后,QT中会发出一个信号,称为loadFinished()
。 通过将此信号绑定到我的一个插槽,该插槽执行了对evaluateJavascript(command)
的调用,从而加载了图表。 当页面尚未完成加载时,Qts webview似乎无法执行Javascript。
无论如何,这是代码的样子(简化):
class something():
def __init__(self):
self.webview = QtWebkitWidgets.QWebView()
self._myBindingFunction()
def _myBindingFunction(self):
self.webview.loadFinished.connect(self._plot)
def _plot(self):
command = ('loadPinch(' + str(random.sample(range(10000), 1000)) +
', ' + str(['2009', '01', '01']) + ');')
self.webview.page().mainFrame().evaluateJavaScript(command)
请注意,这如何简化JS代码; 我不必检查站点是否已加载,因为发出信号后,信号必须准备就绪。
帕维尔·富斯( Pawel Fus)大喊大叫,但带领我进入了正确的轨道。 我已经放弃了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.