Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >PyQT4:"TypeError:尝试配置不可配置属性的属性。“

PyQT4:"TypeError:尝试配置不可配置属性的属性。“
EN

Stack Overflow用户
提问于 2014-11-23 23:12:53
回答 1查看 1.6K关注 0票数 2

在使用pyqt的QWebpage中,观察html元素的事件属性有一些问题。我想用pyqt加载和执行的网页:

代码语言:javascript
运行
AI代码解释
复制
<html>
<head>
<title>Test</title>

<script>
/*
 * object.watch polyfill
 *
 * 2012-04-03
 *
 * By Eli Grey, http://eligrey.com
 * Public Domain.
 * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
 */

    // object.watch
    if (!Object.prototype.watch) {
        console.log("Watch defined...")
        Object.defineProperty(Object.prototype, "watch", {
            enumerable : false,
            configurable : true,
            writable : true,
            value : function(prop, handler) {
                var oldval = this[prop], newval = oldval, getter = function() {
                    return newval;
                }, setter = function(val) {
                    console.log("Set: " + prop);
                    oldval = newval;
                    return newval = handler.call(this, prop, oldval, val);
                };
                console.log("Before if statement...")
                if (true) { //here in original code is: "delete this[prop]", in every browser it is true but in a QWebpage not... why?
                    console.log("After if statement: " + prop
                        + " is observed...")
                    Object.defineProperty(this, prop, {
                        enumerable : true,
                        configurable : true,
                        get : getter,
                        set : function(val) {
                            console.log("Set: " + prop)
                            oldval = newval;
                            var newval = handler.call(this, prop, oldval, val)
                                    || val;
                            return newval;
                        }
                    });
                } else { 
                    console.log("Error: can't be observed")
                }
            }
        });
    }

    // object.unwatch
    if (!Object.prototype.unwatch) {
        Object.defineProperty(Object.prototype, "unwatch", {
            enumerable : false,
            configurable : true,
            writable : false,
            value : function(prop) {
                var val = this[prop];
                delete this[prop]; // remove accessors
                this[prop] = val;
            }
        });
    }
</script>

</head>

<body>

<div id="target" href="#">LINK WITH HANDLER</div>

<script>
    link = document.getElementById("target");
    //
    //link.onclick = myClick2
    link.watch("onclick", function(prop, oldVal, newVal) {
        console.log("watch > onclick has changed!!");
        return newVal;
    });
    link.onclick = myClick;

    function myClick(e) {
        console.log("Dear sir, here is a click");
    }
</script>

当我把它放到html页面并在浏览器上执行时(Chrome,Firefox,Epiphany,.)我得到了想要的行为,可以读取控制台日志消息。

但是,当我试图用QWebpage在python中用pyqt4加载页面时(我也尝试了pyqt5),那么页面的行为方式就不一样了。经过一些测试后,我注意到问题在if-语句中。在每个浏览器中,使用QWebpage都是正确的。当我删除它时,我会从标题中得到错误消息。

有人能告诉我为什么会这样吗?用QWebpage和使用相同JavaScript引擎的普通浏览器呈现的网页有什么不同?我希望我能提供足够的信息。谢谢你的帮助!

下面是获取html页面的代码:

代码语言:javascript
运行
AI代码解释
复制
import sys
import logging
from PyQt4.QtWebKit import QWebPage
from time import time, sleep
from PyQt4.QtCore import QUrl
from PyQt4.Qt import QApplication


class Browser(QWebPage):

def __init__(self, app, proxy = "", port = 0):
    QWebPage.__init__(self)
    self.loadFinished.connect(self._loadFinished)
    self.app = app

def get(self, requested_url, timeout=20):
    logging.debug("Browser started on {}...".format(requested_url))
    self._loading_complete = False
    self.mainFrame().load(QUrl(requested_url))
    t = 0
    while(not self._loading_complete and t < timeout ): # Waiting for finish processing
        self._wait(0.1) 
        t += 0.1

    if not self._loading_complete:
        logging.debug("Timeout Occurs")

    self._analyzing_finished = True
    return self.mainFrame().toHtml()

def _loadFinished(self, result):
        if result:
            self._loading_complete = True

def _wait(self, waittime=1):
    """Wait for delay time
    """
    deadline = time() + waittime
    while time() < deadline:
        sleep(0)
        self.app.processEvents()

def javaScriptConsoleMessage(self, message, lineNumber, sourceID):
    logging.debug("Console: " + message + " at: " + str(lineNumber))       
if __name__ == '__main__':

logging.basicConfig(level=logging.DEBUG,
                format='%(asctime)s: %(levelname)s - %(message)s',
                datefmt='%d.%m.%Y %H:%M:%S',
                #filename='Crawler.log',
                #filemode='w'
                )

app = QApplication(sys.argv)
browser = Browser(app)
browser.get("http://localhost/") #Console output is important
EN

回答 1

Stack Overflow用户

发布于 2014-11-28 16:49:32

我想我可能已经发现了为什么返回值delete是不同的。javascript规范允许浏览器以他们喜欢的任何方式实现delete,因此,您似乎不能依赖其返回值的正确性。

为了给出一个例子,下面是Firefox中发生的事情(使用Scatchpad):

代码语言:javascript
运行
AI代码解释
复制
// page = about:blank

document.body.onclick;
/*
null
*/
document.body.onclick = function(){alert('boo!')};
/*
function (){alert('boo!')}
*/
delete document.body.onclick;
/*
true
*/
document.body.onclick
/*
function (){alert('boo!')}
*/ 

骗子!显然,不可能删除onclick属性,但火狐无论如何都会返回true。这使我得出了一个初步的结论,即webkit javascript引擎在这里做的事情可能是正确的,而其他浏览器也有问题。

有关delete的更多信息,请参见优秀的文章理解删除,特别是和宿主对象一节。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27099592

复制
相关文章
部署一个Sinatra应用程序到Heroku
该文章介绍了如何部署一个Sinatra应用程序到Heroku。首先,需要设置一个Gemfile和一个config.ru文件,使用Git将应用程序部署到Heroku。然后,需要安装Heroku gem,生成SSH密钥并将其添加到Heroku。最后,通过运行`heroku keys:add`命令将SSH密钥添加到Heroku。
Seven塞文
2018/01/05
5.2K0
python启动应用程序和终止应用程序
每天上班,工作需要,电脑上需要每天开机启动一些软件,下班时候,需要关掉一些软件。一个一个打开和关闭貌似是很繁琐的,于是乎,这个脚本产生了。
py3study
2020/01/07
2.4K0
部署一个Sinatra应用程序到Heroku
该文章介绍了如何部署一个基于Sinatra的应用程序到Heroku。首先介绍了Heroku是什么,然后描述了如何利用Sinatra和Heroku创建应用程序,接着给出了部署应用程序的步骤,最后说明了如何通过SSH密钥在Heroku上部署应用程序。
Techeek
2018/01/05
2.7K0
adb shell 启动,停止 android 应用程序一、adb启动 应用程序二、adb停止 应用程序
包名和Activity类的类名一定要输入正确,可以用re-sign工具(在最后的弹出信息框会显示出包名和Activity类名)。
一个会写诗的程序员
2018/08/20
5.9K0
macOS上实现Qt应用程序做文件关联打开
用Qt开发的应用程序要实现文件关联,双击时用默认关联的程序打开文件,在Windows上这个功能非常容易实现。Windows应用程序在安装的时候可以在注册表中写入相关的键值对。打开文件的时候,Windows Explorer会将文件完整的路径作为参数传递给关联的应用程序。这样就可以在启动程序后将这个文件作为目标进行处理。
24K纯开源
2019/07/02
2.1K0
如何在 Mac 上同时打开多个 MediaInfo 应用程序实例?
了解音视频分析工具的小伙伴,一定都知道 MediaInfo,它是一款非常实用的视频参数检测工具,除了可以对视频进行编码分析查询外,还可以对音频文件的编码及信息进行检测,最重要的是这款工具软件是免费的,在 mac OS 系统上此类工具是不常见的,另外,它也有 windows 版本。下面展示一下 MediaInfo 的使用效果:
liuzhen007
2021/10/20
1.5K0
在Heroku中部署一个Sinatra应用程序
在Heroku中部署一个Sinatra应用程序。首先需要在Heroku上注册一个账号,然后创建一个应用程序。接着通过在Gemfile中添加必要的Ruby gems来配置你的应用程序。最后,使用Git将你的应用程序推送到Heroku,并在Heroku上启动该应用程序。
Techeek
2018/01/05
2.7K0
在Heroku中部署一个Sinatra应用程序
应用程序InetlliJ IDEA不能打开
一大早回公司想打开 IDEA,准备魔改一下 Spark,突然发现前两天更新的 IDEA 打不开了(那天更新完后没有尝试打开),WTF。打不开的表现是双击图标毫无反应,我第一反应是,我系统有多个 IDEA,而且还有 N 个版本还有各种社区版交错,当然还有之前一直用的破解版,会不会是版本的问题呢?既然公司现在可以提供企业版,那就没理由继续盗版了,而且那是好几年前了。虽然电脑换过很多次了,但是每次都是 Time Machine,所以配置什么的是一直同步着的,而且 IDEA 是 Java 写的,找 BUG 找问题的思路跟开发 Java 应用的时候也应该是类似的。
runzhliu
2020/08/06
1.8K0
使用Python,怎么mac 上打开一个应用程序?
今天再来分享一个使用os库的小程序,就是如何在mac上打开一个应用程序。我们就以打开Safari浏览器为例。程序非常简单,就是执行一个shell命令。具体程序如下:
TalkPython
2020/12/29
2.7K0
Android源码分析--应用程序启动
1.AMS通过调用startProcessLocked方法向Zygote进程发送请求。
xuexiangjys
2022/04/18
6340
Android源码分析--应用程序启动
应用程序进程启动过程
1.AMS在启动应用程序时会检查者应用程序需要的应用进程是否存在,不存在就会请求Zygote进程启动需要的应用程序进程
用户3112896
2019/09/26
7440
应用程序进程启动过程
应用程序启动速度的优化
Mozillaproject师通过优化Static Initializer(静态初始化,或全局建构函数, Global Constructor)和Binary布局来提升FireFox启动速度的文章。很有參考价值。
全栈程序员站长
2022/07/06
5560
Electron 使用 Webpack2 打包应用程序
前两天看了一下使用 Electron 开发应用程序,今天说说所怎样集成 Electron 和 Webpack2 来打包应用程序。 安装依赖库 这里准备做个小的演示程序,首先安装一些这个演示程序需要看的第三方库 $ npm install --save-dev electron $ npm install --save-dev electron-packager $ npm install --save-dev webpack $ npm install --save-dev webpack-dev-se
kongxx
2018/05/14
1.1K0
WPF 如何在应用程序调试启动
如果在一些无法使用源代码编译的电脑,调试一个exe无法启动,那么需要使用本文的技术。
林德熙
2019/03/13
9040
WPF 如何在应用程序调试启动
WPF 如何在应用程序调试启动
如果在一些无法使用源代码编译的电脑,调试一个exe无法启动,那么需要使用本文的技术。
林德熙
2018/09/19
1.1K0
WPF 如何在应用程序调试启动
Quicksilver - 快速启动你的应用程序
偶然间看别人的视频无意中发现这个小软件,感觉很实用。 它是一个launcher,使用它可以通过键盘快速的启动你的应用程序,而不必用鼠标在一堆的应用程序中选择。
EltonZheng
2021/01/26
5320
WPF 如何在应用程序调试启动
如果在一些无法使用源代码编译的电脑,调试一个exe无法启动,那么需要使用本文的技术。
林德熙
2022/08/04
9020
Spring Boot 应用程序启动流程分析
@SpringBootApplication SpringApplication 以及 run() 方法
凯哥Java
2019/06/28
7100
Spring Boot 应用程序启动流程分析
Spring Boot 应用程序启动流程分析
@SpringBootApplication SpringApplication 以及 run() 方法
动力节点Java培训
2019/01/21
8700
在 .NET 应用程序中运行 JavaScript
前几天我在做一个副业,意识到我需要使用一些 JavaScript 功能。一想到要再次处理 Node.js 和 npm,我就完全放弃了,所以我决定研究一下在 .NET 应用程序中运行 JavaScript 的可能性。很疯狂吧?实际上,这出乎意料的简单。
独立观察员
2022/12/06
2.7K0
在 .NET 应用程序中运行 JavaScript

相似问题

Heroku上的Clojure应用程序未启动;Aleph + RedisToGo超时

10

Heroku应用程序启动超时

32

Heroku上的Scala应用程序-启动超时

20

heroku上的react应用程序未启动

24

Play 2.5.4应用程序在Heroku上未启动

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档