2013-12-12 3 views
3

я следующий код:
HTML + JavaScriptevaluateJavaScript() работает только один раз

<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, не будет выполняться основной темой. Поскольку 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 и, следовательно, остается в том же потоке.

Смежные вопросы