Python 有没有办法同步调用方法';toHtml';这是QWebEnginePage';谁的目标?

Python 有没有办法同步调用方法';toHtml';这是QWebEnginePage';谁的目标?,python,pyqt,pyqt5,qwebengineview,qwebenginepage,Python,Pyqt,Pyqt5,Qwebengineview,Qwebenginepage,我正在尝试从QWebEnginePage对象获取html代码。根据Qt参考,QWebEnginePage对象的“toHtml”是异步方法,如下所示 异步方法以HTML形式检索页面内容,并将其包含在HTML和正文标记中。成功完成后,使用页面内容调用resultCallback 所以我试图找出如何同步调用这个方法 我想要得到的结果如下 class MainWindow(QWidget): html = None ... ... def store_html(self, data):

我正在尝试从QWebEnginePage对象获取html代码。根据Qt参考,QWebEnginePage对象的“toHtml”是异步方法,如下所示

异步方法以HTML形式检索页面内容,并将其包含在HTML和正文标记中。成功完成后,使用页面内容调用resultCallback

所以我试图找出如何同步调用这个方法

我想要得到的结果如下

class MainWindow(QWidget):
  html = None
  ...
  ...
  def store_html(self, data):
    self.html = data

  def get_html(self):
    current_page = self.web_view.page()
    current_page.toHtml(self.store_html)
    # I want to wait until the 'store_html' method is finished
    # but the 'toHtml' is called asynchronously, return None when try to return self.html value like below.
    return self.html 
  ...
  ...
谢谢你阅读这篇文章


祝大家过得愉快。

一个简单的方法就是使用。此类的对象会阻止执行
exec_389;()之后的代码,这并不意味着GUI无法继续工作

class Widget(QWidget):
    toHtmlFinished = pyqtSignal()

    def __init__(self, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)
        self.setLayout(QVBoxLayout())
        self.web_view = QWebEngineView(self)
        self.web_view.load(QUrl("http://doc.qt.io/qt-5/qeventloop.html"))
        btn = QPushButton("Get HTML", self)
        self.layout().addWidget(self.web_view)
        self.layout().addWidget(btn)
        btn.clicked.connect(self.get_html)
        self.html = ""

    def store_html(self, html):
        self.html = html
        self.toHtmlFinished.emit()

    def get_html(self):
        current_page = self.web_view.page()
        current_page.toHtml(self.store_html)
        loop = QEventLoop()
        self.toHtmlFinished.connect(loop.quit)
        loop.exec_()
        print(self.html)


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

注意:同样的方法适用于PySide2。

您可以使用多处理.Connection对象作为多处理.Pipe的send方法的一侧创建作为回调,然后立即使用管道的recv方法的另一端。Recv将一直阻止,直到收到html,所以请记住这一点

例如:

from multiprocessing import Pipe

class MainWindow(QWidget):
    def __init__(...):
        ...
        self.from_loopback,self.to_loopback=Pipe(False)

    def get_html(self):
        current_page = self.web_view.page()
        current_page.toHtml(self.to_loopback.send)
        return self.from_loopback.recv() 

不清楚你为什么想要这个。QWebEngine基于Blink,它为web内容运行一个单独的进程(就像大多数现代浏览器一样)。由于进程之间的IPC调用可能需要时间,QWebEngine要求您定义一个回调函数,以便在IPC调用完成时主进程的事件循环可以继续。因此,在不知道这个问题的理由的情况下,提供最好的答案将是一种冒险。@Ericsir先生,我不知道QWebEngine是基于Blink框架的。我只是想使用我创建的一些按钮在html响应完成后转换web视图屏幕的内容。谢谢你的回答,非常感谢。你的回答对我很有帮助。祝您今天过得愉快!我现在明白了,但这有点愚蠢。它打断了对话的流程顺便说一下,这是关于多处理的文档。管道: