2012-01-16 19 views
2

我正在使用PySide创建一个应用程序,它可以自动加载网页并创建屏幕截图(不,我不能使用现有解决方案之一)。应用程序的一部分获取URL列表,并使用新的 QWebPage对象依次加载每个URL。加载页面后,将截取截图并删除QWebPage对象。在PySide中出现不稳定的“无效信号签名”错误QWebPage

然后每一个现在,只要有足够的运行,我从PySide下面的错误,如抛出一个RuntimeError例外:

Invalid Signal signature: loadStarted() 
Failed to connect signal loadStarted(). 

第一行打印到STDERR(可能是通过Qt的?),第二行是Python异常。

loadStarted()是一个内置的QWebPage信号,而不是我创建的东西。这在90%的时间内工作,我无法弄清楚偶尔会有什么故障。老实说,这个应用程序在设计上非常不寻常,因为它将PySide/Qt挂钩到一个uWSGI服务的web应用程序中 - 这意味着例如我不使用QApplication事件循环,而是使用本地事件循环页面加载。我也没有Qt或Python的经验,所以我可能犯了很多错误,但我无法弄清楚这些是什么。

我在想this后可能与它有关系,但我不确定。

关于下一步看什么的建议?

UPDATE:信号通过下面的代码连接:

class MyWebPage(QWebPage): 

    def __init__(self, parent=None): 
     super(MyWebPage, self).__init__(parent) 
     self.loadStarted.connect(self.started) 
     self.loadFinished[bool].connect(self.finished) 

MyWebPage对象被作为不被删除,直到该进程关闭一个不同的单一的QObject实例的子创建。通过调用page.deleteLater()来删除它们,一旦我完成它们。因为我运行的本地事件循环,我触发延迟缺失退出本地事件循环发生后,通过调用:

# self.eventLoop is the local event loop, which at this stage is not running 
self.eventLoop.processEvents() 

# self.app is the QApplication instance 
self.app.sendPostedEvents(None, QEvent.DeferredDelete) 
+0

信号如何连接?你使用什么代码来确保网页对象被正确删除?你是否试图创建一个简化的测试用例来重现问题? – ekhumoro

+0

我试着创建一个简化的测试用例,但到目前为止不能 - 这是很难重现的。我用一些可能有所帮助的信息更新了这个问题。 – shevron

+0

你碰巧有任何多线程正在进行吗? – Luke

回答

0

在我升级到PySide 1.2.1后,为了什么值得,这个问题和其他问题终于以一种体面的方式解决了。

0

我有同样的问题(我会在一段时间得到这些错误每一次,但我无法一直重现它)。我认为你可能是对的,它与你尝试将信号连接到它们时不存在的方法有关 - 只是为了测试,我把.connect调用放在一个单独的方法中,并且错误消失了。例如:

编辑: (几个小时后),我想我说话太快 - 我只是再次得到了错误。

UPDATE: (几个星期后)

我的语法发挥各地有很多,有时甚至得到了抛出一个RuntimeError(在PySide可能this bug?)。我还没有完全知道为什么,但由于错误发生不一致,你在迫使它这样很可能安全:

class MyWebPage(QWebPage): 

def __init__(self, parent=None): 
    super(MyWebPage, self).__init__(parent) 

    success = False 
    while not success: 
     try: 
      success = self.loadStarted.connect(self.started) 
     except RuntimeError: 
      success = False 

    success = False 
    while not success: 
     try: 
      success = self.loadFinished[bool].connect(self.finished) 
     except RuntimeError: 
      success = False 

如果你真的是安全的,你也许可以保持一个循环计数器,如果信号在某个阈值之前没有正确连接,就会使程序崩溃。

相关问题