2013-01-08 88 views
6

我想在PyQt的evaluateJavaScript()(或可能是類似的)中創建一個函數,並顯示評估函數的結果。 實數函數會更大,並且可能不是字符串。如何將JavaScript函數的結果放入python變量中。 PyQt

我只是有趣的如何創建一個PyQt代碼內的函數,並獲得結果到python變量。

爲了更清楚我給你一個例子: 這就是我想上http://jquery.comloadFinished後鍵入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_() 
+0

通過將其作爲一個GET或POST參數 – Ibu

+0

你可以給我是一個例子嗎? (0).html();' – Vor

+1

)謝謝 –

回答

7

在這個例子中我首先創建一個myWindow通過傳遞self到主框架JavaScript對象,然後調用evaluateJavaScriptloadFinished

#!/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

太棒了,你是最棒的!!!!!!!!!!!!!!!!!!!!( – Vor

+0

這真的是一個很棒的答案,因爲它很簡潔,但卻說明了很多有用的東西。儘管如此,對於那些還不完全熟練使用Python,PyQt和JavaScript的人來說,英文說明會很有幫助。我會給它一個鏡頭。 –

+0

如果有用,可以使用以下任何一種:雖然myWindow對象是一個Python對象,但它繼承自QWebView,因此它構造自身時可以將自身(使用Qt)作爲JavaScript對象插入網頁。它還傳入兩個回調:1)on_loadFinished()方法,以便在頁面加載後繼續處理; 2)網頁自己的JavaScript代碼可以調用的showMessage()方法。一旦頁面加載後會觸發on_loadFinished(),這會給網頁提供一些JavaScript(getJsValue)來運行,並且該代碼反過來調用Python方法showMessage()。完整的循環。 –

相關問題