evaluateJavaScript()只能工作一次

时间:2013-12-12 16:42:54

标签: javascript python pyqt pyside qwebview

我有以下代码:
HTML + JavaScript

<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)仅适用于第一次。

还有其他人有同样的问题吗?

1 个答案:

答案 0 :(得分:0)

主线程不会执行您向threading.Timer提供的回调。由于QWebView继承自QWidget,因此您必须与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的事件循环,因此保持在同一个线程中。