我正在创建一个应用程序,它可以自动加载网页并使用PySide创建屏幕截图(不,我不能使用现有的解决方案之一)。应用程序的一部分获取URL列表,并使用新 QWebPage对象依次加载每个URL。加载页面后,将截取屏幕截图并删除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帖子可能与它有关,但我不确定。
关于下一步要去哪里的建议?
更新:信号通过以下代码连接:
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 :(得分:0)
我遇到了同样的问题(我偶尔会遇到这些错误,但我不能一直重现它)。我认为你可能是正确的,当你尝试将信号连接到它们时,它与不存在的方法有关 - 只是为了测试它,我把.connect调用放在一个单独的方法中,错误就消失了。例如:
修改强> (几个小时后)我想我说的太快了 - 我再次收到了错误。
<强>更新强> (几个星期后)
我经常使用语法,偶尔也会遇到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
如果确实想要安全,那么你可以保留一个循环计数器,如果信号在某个阈值之前没有正确连接,就会使程序崩溃。
答案 1 :(得分:0)
在我升级到PySide 1.2.1之后,这个问题和其他问题最终以一种体面的方式解决了。