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_(), потому что это привело к зависанию моего приложения, так как это часть более крупной программы без командной строки, которая не используется.
Любой вклад приветствуется.
ура