Domanda

Sto creando un'applicazione che automatizza il caricamento delle pagine web e la creazione di screenshot (no, non posso utilizzare una delle soluzioni esistenti) utilizzando PySide. Una parte dell'app ottiene un elenco di URL e carica ogni URL a turno utilizzando un nuovo oggetto QWebPage. Dopo che la pagina è stata caricata, viene acquisita una schermata e l'oggetto QWebPage viene eliminato.

Ogni tanto, dato un numero sufficiente di esecuzioni, ricevo il seguente errore da PySide, come eccezione di RuntimeError:

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

La prima riga viene stampata su STDERR (probabilmente da Qt?) e la seconda riga è l'eccezione di Python.

loadStarted () è un segnale QWebPage integrato, non qualcosa che ho creato. Funziona il 90% delle volte e non sono riuscito a capire cosa lo fa fallire occasionalmente.

Ad essere onesti, questa app ha un design piuttosto insolito, poiché aggancia PySide / Qt a un'app Web servita da uWSGI - questo significa che, ad esempio, non sto utilizzando il ciclo di eventi QApplication ma piuttosto un ciclo di eventi locale per ogni pagina caricare. Inoltre non ho esperienza né in Qt né in Python, quindi è possibile che stia commettendo molti errori, ma non riesco a capire quali siano.

Sto pensando che questo post potrebbe avere qualcosa a che fare con esso, ma sono non è sicuro.

Qualche suggerimento su dove cercare dopo?

AGGIORNAMENTO: il segnale è collegato tramite il seguente codice:

class MyWebPage(QWebPage):

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

Gli oggetti MyWebPage vengono creati come figli di una singola istanza QObject diversa che non viene eliminata fino alla chiusura del processo. Vengono cancellati chiamando page.deleteLater () una volta che ho finito con loro. Dato che sto eseguendo un loop di eventi locale, faccio scattare le eliminazioni differite dopo essere uscito dal loop di eventi locale chiamando:

 # 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)
È stato utile?

Soluzione 2

Per quello che vale, questo e altri problemi sono stati finalmente risolti in modo decente dopo l'aggiornamento a PySide 1.2.1.

Altri suggerimenti

Avevo lo stesso problema (ricevevo questi errori ogni tanto, ma non riuscivo a riprodurlo in modo coerente). Penso che tu abbia ragione sul fatto che ha qualcosa a che fare con metodi che non esistono quando provi a connettere i segnali a loro - solo per testarlo, ho messo le chiamate .connect in un metodo separato e gli errori sono spariti . Ad esempio:

MODIFICA: (poche ore dopo) Credo di aver parlato troppo presto - ho appena ricevuto nuovamente l'errore.

AGGIORNAMENTO: (poche settimane dopo)

Ho giocato molto con la sintassi e occasionalmente ho ricevuto anche un RuntimeError (forse questo bug in PySide?). Non sono ancora completamente sicuro del perché, ma poiché l'errore si verifica in modo incoerente, probabilmente sei sicuro di forzarlo in questo modo:

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

Se vuoi davvero essere al sicuro, potresti tenere un contatore di loop e mandare in crash il programma se il segnale non si connette correttamente prima di una certa soglia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top