Python QWebView - Скриншот с задержкой

Мне нужен скрипт на python, чтобы сделать скриншот веб-страницы. У меня есть следующий код, который хорошо работает:

class Screenshot(QWebView):
def __init__(self):
    self.app = QApplication(sys.argv)
    QWebView.__init__(self)
    self._loaded = False
    self.loadFinished.connect(self._loadFinished)

def capture(self, url, output_file):
    self.load(QUrl(url))
    self.wait_load()

    # set to webpage size
    frame = self.page().mainFrame()
    self.page().setViewportSize(QSize(900,1600))

    # render image
    image = QImage(self.page().viewportSize(), QImage.Format_ARGB32)
    painter = QPainter(image)
    frame.render(painter)
    painter.end()
    print 'saving', output_file
    image.save(output_file)

def wait_load(self, delay=0):
    # process app events until page loaded

    while not self._loaded:

        self.app.processEvents()
        time.sleep(delay)
    self._loaded = False

def _loadFinished(self, result):
    self._loaded = True

Однако снимок экрана снимается сразу после загрузки страницы, у страниц, которые я пытаюсь сделать снимок экрана, есть интерфейс JS, для загрузки которого требуется около 20 секунд (большие графики). Как бы я задержал браузер?

Я знаю, что не могу сделать это с помощью time.sleep(), так как он останавливает поток, включая веб-браузер, в результате получается то же изображение, поэтому я знаю, что мне нужно использовать QTimer(), но я пробовал следующее, но это не так т работа:

class Screenshot(QWebView):
def __init__(self):
    self.app = QApplication(sys.argv)
    QWebView.__init__(self)

def capture(self, url, output_file):

    self._file = output_file
    # set to webpage size
    frame = self.page().mainFrame()
    self.page().setViewportSize(QSize(900,1600))

    self.timerScreen = QTimer()
    self.timerScreen.setInterval(30000)
    self.timerScreen.setSingleShot(True)
    self.timerScreen.timeout.connect(self.grab)
    self.loadFinished.connect(self.timerScreen.start)

    self.load(QUrl(url))

def grab(self):

    # render image
    image = QImage(self.page().viewportSize(), QImage.Format_ARGB32)
    painter = QPainter(image)
    frame.render(painter)
    painter.end()
    print 'saving', self._file
    image.save(self._file)

Вместо этого это вызывает вызовы Screenshot.capture(), которые возвращаются мгновенно, и снимок экрана не выполняется.

Также я не могу использовать метод app.exec_(), потому что это привело к зависанию моего приложения, так как это часть более крупной программы без командной строки, которая не используется.

Любой вклад приветствуется.

ура

0 ответов

Другие вопросы по тегам