2013-01-08 16 views
6

Chcę utworzyć funkcję w PyQt evaluateJavaScript() (lub może być podobna), a następnie wyświetlić wynik oceny funkcji. Prawdziwa funkcja będzie znacznie większa i może nie być ciągiem.Jak umieścić wynik funkcji JavaScript w zmiennej Pythona. PyQt

Ciekawe, jak utworzyć funkcję wewnątrz kodu PyQt, a następnie uzyskać wynik w zmiennej Pythona.

Aby być bardziej jasne, dam ci przykład: to js które chcę wpisać po loadFinished na http://jquery.com:

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

Jeśli mogę to zrobić w konsoli przeglądarki, „I będzie uzyskać wyjście:

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

I chcę zapisać to wyjście w zmiennej.

#!/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_() 
+0

przekazując go jako GET lub POST parametr – Ibu

+0

można dać ja przykład? – Vor

+1

Właściwe JQuery: 'w = $ ('p'). Children(). Eq (0) .html();' –

Odpowiedz

7

W tym przykładzie najpierw tworzę myWindow javascript obiekt przekazując self do ramy głównej, a następnie zadzwonić evaluateJavaScript gdy loadFinished:

#!/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_()) 
+1

Awesome, jesteś najlepszy !!! Dziękuję – Vor

+0

To naprawdę jest świetna odpowiedź, ponieważ jest zwięzła, ale pokazuje wiele użytecznych rzeczy. Jednakże angielski opis byłby pomocny dla tych, którzy nie są jeszcze w pełni biegli w Pythonie, PyQt i JavaScript. Dam ci szansę. –

+0

Może użyć dowolnego z nich, jeśli jest użyteczny: Chociaż obiekt myWindow jest obiektem w języku Python, dziedziczy on z QWebView i dlatego, ponieważ sam się konstruuje, może wstawić się (używając Qt) na stronie jako obiekt JavaScript. Przekazuje również dwa wywołania zwrotne: 1) metodę on_loadFinished(), aby kontynuować przetwarzanie po załadowaniu strony; 2) metoda showMessage(), którą może wywołać własny kod JavaScript strony internetowej. Po załadowaniu strony wyzwala on_loadFinished(), co daje stronie trochę JavaScript (getJsValue) do uruchomienia, a ten kod z kolei wywołuje metodę Python showMessage(). Pełne koło. –

Powiązane problemy