2013-12-12 102 views
3

我有以下代碼:
HTML + JavaScript的evaluateJavaScript()只能使用一次

<style type="text/css"> 
.color1{ 
color: #3D8BD0; 
} 
</style> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 
<body> 
<div id="mensagem">Mensage</div> 
<script> 
    $("#mensagem").click(function(event) { 
     printer.text('Hello'); 
    }); 
</script> 
</body> 

而且.py文件:

# -*- coding:utf-8 -*- 
import sys 
from PySide.QtCore import Slot, QObject, QUrl 
from PySide.QtGui import QApplication 
from PySide.QtWebKit import QWebView 
from threading import Timer 

class Dac(QObject): 
    def __init__(self, parent=None): 
     super(Dac, self).__init__(parent) 
     self.defultMsg = "default" 
     self.app = QApplication(sys.argv) 
     self.view = QWebView() 
     self.view.resize(445, 791) 
     self.view.load(QUrl("./page.html")) 
     self.frame = self.view.page().mainFrame() 
     self.frame.addToJavaScriptWindowObject('printer', self) 
     self.view.show() 
     self.app.exec_() 
     sys.exit(self.app.exec_()) 

    def changeText(self, mensagem): 
     print mensagem 
     self.frame.evaluateJavaScript(mensagem) 

    @Slot(str) 
    def text(self, message): 
     print message 
     strm = '$("#mensagem").html("'+message+'").addClass("color1");' 
     self.changeText(strm) #this change the text 
     t = Timer(6.5, self.timeoff) 
     t.start() 

    def timeoff(self): 
     strm = '$("#mensagem").html("'+self.defultMsg+'").removeClass("color1");' 
     self.changeText(strm) #this don't change 
     print "debug" 

dac = Dac() 

當我運行了Python文件,窗口打開並向我顯示HTML頁面,然後當我點擊div「mensagem」時,文本只會改變一次。
所以我認爲我的問題是,聲明self.frame.evaluateJavaScript(mensagem)只適用於第一次。

有沒有其他人有同樣的問題?

+0

我有同樣的問題,需要推高 – lithiium

+0

我用PyQt4和程序崩潰測試了你的代碼。當你運行它時,這也會發生嗎? – ProgrammingIsAwsome

回答

0

您提供給threading.Timer的回調將不會由主線程執行。由於從QWidgetQWebView繼承,你必須與它交互from the main thread

儘管QObject的是可重入的GUI類,特別是QWidget的和它的所有子類,是不可重入。他們只能從主線程使用。

您可以通過使用PySide.QtCore.QTimer和更換該代碼解決這個問題:

t = Timer(6.5, self.timeoff) 
t.start() 

有了:

QTimer.singleShot(6.5 * 1000, self.timeoff) 

QTimer作品與Qt的事件循環,因此停留在同一個線程。