Question

Je crée une application qui automatise le chargement des pages Web et la création de captures d'écran (non, je ne peux pas utiliser l'une des solutions existantes) à l'aide de Pyside. Une partie de l'application obtient une liste d'URL et charge chaque URL à son tour en utilisant un Nouveau Objet QWebPage. Une fois la page chargée, une capture d'écran est prise et l'objet QWebPage est supprimé.

De temps en temps, étant donné suffisamment de courses, j'obtiens l'erreur suivante de Pyside, comme exception RuntimeError:

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

La première ligne est imprimée à stderr (probablement par QT?) Et la deuxième ligne est l'exception Python.

LoadStarted () est un signal QWebPage intégré, pas quelque chose que j'ai créé. Cela fonctionne 90% du temps, et je n'ai pas pu comprendre ce qui le fait échouer à l'occasion.

Pour être honnête, cette application est assez inhabituelle dans la conception, car elle accroche Pyside / Qt dans une application Web servie uwsgi - cela signifie que par exemple, je n'utilise pas la boucle d'événement Qapplication mais plutôt une boucle d'événement locale pour chaque charge de page. Je ne suis pas non plus expérimenté dans QT ou Python, il est donc possible de faire beaucoup d'erreurs, mais je ne peux pas comprendre ce que ce sont.

Je suis en train de penser cette Post pourrait avoir quelque chose à voir avec cela, mais je ne suis pas sûr.

Des suggestions sur où chercher ensuite?

METTRE À JOUR: Le signal est connecté via le code suivant:

class MyWebPage(QWebPage):

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

Les objets MyWebPage sont créés en tant qu'enfants d'une instance QObject unique différente qui n'est pas supprimée tant que le processus s'arrête. Ils sont supprimés par l'appel page.Deletelater () une fois que j'en ai fini avec eux. Depuis que j'exécute une boucle d'événement locale, je déclenche des suppressions différées après avoir quitté la boucle d'événements locaux en appelant:

 # 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)
Était-ce utile?

La solution 2

Pour ce que cela vaut, ce problème et d'autres ont finalement été résolus de manière décente après avoir passé à Pyside 1.2.1.

Autres conseils

J'avais le même problème (j'aurais ces erreurs de temps en temps, mais je ne pouvais pas le reproduire toujours). Je pense que vous avez peut-être raison de dire que cela a quelque chose à voir avec les méthodes qui ne sont pas existantes lorsque vous essayez de leur connecter les signaux - Juste pour tester cela, j'ai mis les appels .Connect dans une méthode distincte, et les erreurs ont disparu. Par exemple:

ÉDITER:(Quelques heures plus tard) Je suppose que j'ai parlé trop tôt - je viens de recevoir l'erreur.

METTRE À JOUR:(quelques semaines plus tard)

J'ai beaucoup joué avec la syntaxe et j'ai même parfois obtenu une éerre runtime (peut-être Ce bug à Pyside?). Je ne sais toujours pas pourquoi, mais comme l'erreur se produit de manière incohérente, vous êtes probablement en sécurité pour le forcer comme ceci:

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

Si vous vraiment Vous voulez être en sécurité, vous pourriez peut-être garder un compteur de boucle et simplement écraser le programme si le signal ne se connecte pas correctement avant un seuil.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top