Python 有没有办法同步调用方法';toHtml';这是QWebEnginePage';谁的目标?
我正在尝试从QWebEnginePage对象获取html代码。根据Qt参考,QWebEnginePage对象的“toHtml”是异步方法,如下所示 异步方法以HTML形式检索页面内容,并将其包含在HTML和正文标记中。成功完成后,使用页面内容调用resultCallback 所以我试图找出如何同步调用这个方法 我想要得到的结果如下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):
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视图屏幕的内容。谢谢你的回答,非常感谢。你的回答对我很有帮助。祝您今天过得愉快!我现在明白了,但这有点愚蠢。它打断了对话的流程顺便说一下,这是关于多处理的文档。管道: