2012-01-16 5 views
2

PySideを使用して、Webページの読み込みとスクリーンショットの作成を自動化するアプリケーションを作成しています(いいえ、既存のソリューションのいずれも使用できません)。アプリの一部がURLのリストを取得し、新しい QWebPageオブジェクトを使用して各URLを順番に読み込みます。ページがロードされると、スクリーンショットが作成され、QWebPageオブジェクトが削除されます。PySide QWebPageで誤った "シグナルシグネチャ"エラーが発生する

すべての今して、十分に実行与えられた、私は例外RuntimeError例外として、PySideから次のエラーが発生します。

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

最初の行は、(おそらくQtのことで?)STDERRに出力され、2行目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呼び出しを置き、エラーはなくなりました。たとえば:

EDIT: は(数時間後)私はあまりにもすぐに話を聞いたと思う - 私は再びエラーが発生しました。

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 

あなた本当にが安全になりたい場合は、あなたは多分ループを保つことができますシグナルがある閾値の前に正しく接続されていない場合は、プログラムをクラッシュさせてください。

関連する問題