JavaScript fonksiyonunun sonucunu Python değişkenine nasıl koyulur. PyQt
PyQt'te evaluateJavaScript() (veya benzer bir fonksiyon) fonksiyonu yapmak ve ardından değerlendirilen fonksiyonun sonucunu göstermek istiyorum. Gerçek fonksiyon çok daha büyük olacak ve bir string olmayabilir.
Ben sadece PyQt kodu içinde bir fonksiyon nasıl oluşturulur ve sonra sonucunu Python değişkenine nasıl alırım, onu merak ediyorum.
Daha net olmak için size bir örnek vereceğim: işte loadFinished sonrasında http://jquery.com adresine yazmak istediğim js şudur:
w = document.getElementsByTagName('p')[0];
w.innerHTML
Bunu tarayıcı konsolunda yaparsam, bir çıktı alırım:
"jQuery is a fast and concise JavaScript Library ...... blah blah blah"
Ve bu çıktıyı bir değişkende saklamak istiyorum.
#!/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_()
Cevap #1
Bu örnekte önce ana çerçeveye self geçerek bir myWindow javascript nesnesi oluşturuyorum, ardından loadFinished olduğunda evaluateJavaScript çağırıyorum:
#!/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_())
