我有以下代码:
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)
仅适用于第一次。
还有其他人有同样的问题吗?
答案 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的事件循环,因此保持在同一个线程中。