【问题标题】:evaluateJavaScript() only works onceevaluateJavaScript() 只工作一次
【发布时间】:2013-12-31 04:45:44
【问题描述】:

我有以下代码:
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) 仅在第一次有效。

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

【问题讨论】:

  • 我也有同样的问题,需要顶一下
  • 我已经用 PyQt4 测试了你的代码并且程序崩溃了。运行时也会出现这种情况吗?

标签: javascript python pyqt pyside qwebview


【解决方案1】:

您提供给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 的事件循环一起工作,因此保持在同一个线程中。

【讨论】:

    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 2017-01-06
    • 2018-06-22
    • 2015-09-18
    • 1970-01-01
    • 2013-09-28
    • 2013-03-30
    • 2015-06-04
    相关资源
    最近更新 更多