【问题标题】:How to put result of JavaScript function into python variable. PyQt如何将 JavaScript 函数的结果放入 python 变量中。 PyQt
【发布时间】:2013-01-08 04:22:18
【问题描述】:

我想在 PyQt evaluateJavaScript() 中创建一个函数(或者可能是类似的),然后显示评估函数的结果。 真正的函数会大很多,而且可能不是字符串。

我只对如何在 PyQt 代码中创建函数并将结果放入 python 变量感兴趣。

为了更清楚,我举个例子: 这就是我想在loadFinishedhttp://jquery.com之后输入的js:

w = document.getElementsByTagName('p')[0];
w.innerHTML

如果我在浏览器控制台中执行此操作,我将得到一个输出:

"jQuery is a fast and concise JavaScript Library ...... blah blah blah"

我想将此输出存储在一个变量中。

#!/usr/bin/env python

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
import os, sys, signal
from urllib2 import urlopen

class GBot(QWebView):

    def __init__(self):
        QWebView.__init__(self)
        self.setPage(BrowserSettings())
        #self.jquery = get_jquery()
        self.load(QUrl('http://jquery.com'))
        self.frame = self.page().currentFrame()

    def _loadFinished(self, ok):
        doc = self.frame.documentElement()
        #doc.evaluateJavaScript(self.jquery)
        r = doc.evaluateJavaScript('''w = document.getElementsByTagName('p')[0]; w.innerHTML''')
        print r #want to do something like this


if __name__ == '__main__':
    app = QApplication(sys.argv)
    bot = GBot()
    bot.show()
    if signal.signal(signal.SIGINT, signal.SIG_DFL):
        sys.exit(app.exec_())
    app.exec_()

【问题讨论】:

  • 通过将其作为 get 或 post 参数传递
  • 你能举个例子吗?
  • 正确的 JQuery:w = $('p').children().eq(0).html();

标签: javascript python qt pyqt


【解决方案1】:

在这个例子中,我首先通过将self 传递给主框架来创建一个myWindow javascript 对象,然后在loadFinished 时调用evaluateJavaScript:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from PyQt4 import QtCore, QtGui, QtWebKit  

getJsValue = """ 
w = document.getElementsByTagName('p')[0];
myWindow.showMessage(w.innerHTML);
"""  

class myWindow(QtWebKit.QWebView):  
    def __init__(self, parent=None):
        super(myWindow, self).__init__(parent)

        self.page().mainFrame().addToJavaScriptWindowObject("myWindow", self)

        self.loadFinished.connect(self.on_loadFinished)

        self.load(QtCore.QUrl('http://jquery.com'))

    @QtCore.pyqtSlot(str)  
    def showMessage(self, message):
        print "Message from website:", message

    @QtCore.pyqtSlot()
    def on_loadFinished(self):
        self.page().mainFrame().evaluateJavaScript(getJsValue) 

if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('myWindow')

    main = myWindow()
    main.show()

    sys.exit(app.exec_())

【讨论】:

  • 这确实是一个很棒的答案,因为它简洁但说明了很多有用的东西。不过,对于那些还没有完全流利使用 Python、PyQt 和 JavaScript 的人来说,英文描述会很有帮助。我试试看。
  • 如果有用的话,可以使用其中的任何一个:虽然 myWindow 对象是 Python 对象,但它继承自 QWebView,因此当它自己构造时,可以将自己(使用 Qt)作为 JavaScript 对象插入到网页中。它还传入两个回调: 1) on_loadFinished() 方法,以便在页面加载后继续处理; 2) 网页自带的JavaScript代码可以调用的showMessage()方法。一旦页面加载完毕,就会触发 on_loadFinished(),这会为网页提供一些 JavaScript (getJsValue) 以运行,然后该代码会调用 Python 方法 showMessage()。整圈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 2013-10-17
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多