如何将 JavaScript 函数的结果放入 python 变量中。 PyQt
Posted
技术标签:
【中文标题】如何将 JavaScript 函数的结果放入 python 变量中。 PyQt【英文标题】:How to put result of JavaScript function into python variable. PyQt 【发布时间】:2013-01-08 04:22:18 【问题描述】:我想在 PyQt evaluatejavascript() 中创建一个函数(或者可能是类似的),然后显示评估函数的结果。 真正的函数会大很多,而且可能不是字符串。
我只对如何在 PyQt 代码中创建函数并将结果放入 python 变量感兴趣。
为了更清楚,我举个例子:
这就是我想在loadFinished
http://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();
【参考方案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()。整圈。以上是关于如何将 JavaScript 函数的结果放入 python 变量中。 PyQt的主要内容,如果未能解决你的问题,请参考以下文章