Получение ошибочных ошибок «Недопустимая подпись сигнала» в PySide QWebPage - PullRequest
2 голосов
/ 16 января 2012

Я создаю приложение, которое автоматизирует загрузку веб-страниц и создание скриншотов (нет, я не могу использовать одно из существующих решений), используя PySide.Одна часть приложения получает список URL-адресов и загружает каждый URL-адрес по очереди, используя объект new QWebPage.После загрузки страницы делается снимок экрана и объект QWebPage удаляется.

Время от времени, при достаточном количестве прогонов, я получаю следующую ошибку из PySide в качестве исключения RuntimeError:

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

Первая строка печатается в STDERR (возможно, Qt?)и вторая строка - исключение Python.

loadStarted () - это встроенный сигнал QWebPage, а не то, что я создал.Это работает в 90% случаев, и я не мог понять, почему он иногда терпит неудачу.

Если честно, это приложение довольно необычно по дизайну, так как оно подключает PySide / Qt к веб-приложению, обслуживаемому uWSGI - это означает, что, например, я не использую цикл событий QApplication, а скорее локальный цикл событийдля каждой загрузки страницы.Я также не опытен ни в Qt, ни в Python, поэтому возможно, что я делаю много ошибок, но я не могу понять, что это такое.

Я думаю, этот пост может иметь к этому какое-то отношение, но я не уверен.

Есть предложения о том, где искать дальше?

ОБНОВЛЕНИЕ: сигнал связан с помощью следующего кода:

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)

Ответы [ 2 ]

0 голосов
/ 17 сентября 2013

Что и стоит, эта и другие проблемы были окончательно решены достойным образом после того, как я обновился до PySide 1.2.1.

0 голосов
/ 04 июля 2012

У меня была та же проблема (я получал эти ошибки время от времени, но я не мог последовательно воспроизвести ее).Я думаю, вы, возможно, правы, что это как-то связано с методами, которых не существует, когда вы пытаетесь подключить к ним сигналы - , просто чтобы проверить это, я поместил вызовы .connect в отдельный метод, и ошибки исчезли.,Например:

РЕДАКТИРОВАТЬ: (несколько часов спустя) Я думаю, я говорил слишком рано - я только что получил ошибку снова.

ОБНОВЛЕНИЕ: (несколько недель спустя)

Я много играл с синтаксисом и иногда даже получал RuntimeError (возможно, эта ошибка в PySide?).Я до сих пор не совсем уверен, почему, но поскольку ошибка возникает непоследовательно, вы, вероятно, можете заставить ее сделать так:

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

Если вы действительно хотите быть в безопасности,возможно, вы могли бы сохранить счетчик циклов и просто завершить работу программы, если сигнал не соединится правильно до некоторого порога.

...