PyQt中的evaluateJavaScript-未调用函数

PyQt中的evaluateJavaScript-未调用函数,javascript,python,qt,highcharts,pyqt4,Javascript,Python,Qt,Highcharts,Pyqt4,我对PyQt/其Webview有问题。困扰我的代码应该呈现一个图表,但事实并非如此。我正在使用Highcharts框架,并为通过Python呈现图表的javascript函数提供数据。我还检查webview是否准备就绪,因为这是我以前的错误。所讨论的代码如下所示: command = ('loadPinch(' + str(random.sample(range(10000), 1000)) + ', ' + str(['2009', '01', '01']) + ');

我对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示例图):

我可能会告诉你,如果我打印我将evaluateJavaScript交给控制台的命令,而不是执行它并将其粘贴到开发人员控制台,它会按预期执行并呈现图表,这让我相信存在某种无法跟踪的竞争条件

有人知道问题出在哪里吗

问候,, 卡森


注意:问题仍然存在。

我最终找到了解决方案;我想得太多了

当页面加载完成时,QT中会发出一个信号,称为
loadFinished()
。通过将此信号绑定到我的一个插槽,该插槽执行对
evaluateJavascript(command)
的调用,图表被加载。当页面尚未完成加载时,Qts webview似乎在执行Javascript时遇到问题

无论如何,代码就是这样(简化的):

注意这是如何简化JS代码的;我不必检查站点是否已加载,因为信号发出后,它必须准备就绪


但我还是要大喊一声,因为我走上了正确的道路。我已经放弃了。

我终于找到了解决办法;我想得太多了

当页面加载完成时,QT中会发出一个信号,称为
loadFinished()
。通过将此信号绑定到我的一个插槽,该插槽执行对
evaluateJavascript(command)
的调用,图表被加载。当页面尚未完成加载时,Qts webview似乎在执行Javascript时遇到问题

无论如何,代码就是这样(简化的):

注意这是如何简化JS代码的;我不必检查站点是否已加载,因为信号发出后,它必须准备就绪


但我还是要大喊一声,因为我走上了正确的道路。我已经放弃了。

JavaScript控制台中有错误吗?您能用python代码在浏览器中发布生成的代码吗?并没有错误。不过,变量readyStateCheckInterval存在。生成的代码看起来与此类似(尽管数据部分较长):然后,evaluateJavaScript看起来不像您期望的那样工作。不幸的是,我不是webView的专家,但是,你尝试过解决方案吗?遗憾的是,这是一个不同的evaluateJavascript函数(我的是qt,不是android)。我将从文档中阅读一些信息。经过几次尝试,我很容易地解决了这个问题。qt有一个loadFinished信号,我刚刚绑定到plot方法。现在它就像一个符咒。似乎在站点完全加载之前,您无法添加到JavaScript。您在JavaScript控制台中有任何错误吗?您能用python代码在浏览器中发布生成的代码吗?并没有错误。不过,变量readyStateCheckInterval存在。生成的代码看起来与此类似(尽管数据部分较长):然后,evaluateJavaScript看起来不像您期望的那样工作。不幸的是,我不是webView的专家,但是,你尝试过解决方案吗?遗憾的是,这是一个不同的evaluateJavascript函数(我的是qt,不是android)。我将从文档中阅读一些信息。经过几次尝试,我很容易地解决了这个问题。qt有一个loadFinished信号,我刚刚绑定到plot方法。现在它就像一个符咒。似乎在站点完全加载之前,您无法添加到JavaScript。
    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
        }]
    });
};
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)