evaluatteJavaScript()只工作一次

evaluateJavaScript() only works once

本文关键字:一次 evaluatteJavaScript 工作      更新时间:2023-09-26

我有以下代码:
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"mensage"时,文本只会更改一次
所以我认为我的问题是语句self.frame.evaluateJavaScript(mensagem)只在第一次时起作用。

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

您提供给threading.Timer的回调将不会由主线程执行。由于QWebView继承自QWidget,因此必须从主线程与之交互

尽管QObject是可重入的,但GUI类,尤其是QWidget及其所有子类,是不可重入。它们只能从主线程使用。

您可以使用PySide.QtCore.QTimer并替换以下代码来修复此问题:

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

带有:

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

QTimer与Qt的事件循环一起工作,因此保持在同一线程中。