Estou tentando salvar uma captura de tela de um site com o QtWebEngineView, mas a imagem resultante sempre acaba vazia.
import sys
import time
from PyQt6.QtCore import *
from PyQt6.QtGui import *
from PyQt6.QtWidgets import QApplication, QWidget
from PyQt6.QtWebEngineWidgets import QWebEngineView
class Screenshot(QWebEngineView):
def __init__(self):
self.app = QApplication(sys.argv)
QWebEngineView.__init__(self)
self._loaded = False
self.loadFinished.connect(self._loadFinished)
def capture(self, url, output_file):
self.resize(QSize(1024, 768))
self.load(QUrl(url))
self.wait_load()
image = QImage(self.size(), QImage.Format.Format_ARGB32)
painter = QPainter(image)
self.render(painter)
painter.end()
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
s = Screenshot()
s.capture("https://www.google.com", "screenshot.png")
Eu tentei variações do código onde o QTWebEngineView é renderizado em uma janela de aplicativo e essa parte funciona. Isso wait_load
também garante que o site seja carregado antes de prosseguir com a pintura. No entanto, de alguma forma, a imagem renderizada é sempre um png branco completo em vez do site.
Edição: Votação para reabrir porque a solução na "duplicata" não parece resolver este caso.
O problema é causado pelo QWebengineView não ser renderizado porque o método show() não é chamado. Conforme indicado em outros posts, você também deve usar
Qt.WidgetAttribute.WA_DontShowOnScreen
. Aqui está uma versão que evita usartime.sleep
andQXApplication.processEvents
.