【问题标题】:save html files in QWebEngineView browser在 QWebEngineView 浏览器中保存 html 文件
【发布时间】:2018-07-01 08:38:18
【问题描述】:

我正在尝试使用 Python QWebEngineView 创建自己的浏览器。我遵循了一个在 PyQt5 以前版本(大约 2015 年)上工作的教程,但由于它最近的更新,以前代码的某些部分不再工作。

我已经修复了大多数错误,但我无法执行 html 文件打开/保存。单击保存按钮时,我总是收到系统错误。以下是我的文件保存代码:

(QMainWindow 类)

save_file_action = QAction(QIcon("disk--pencil.png"), "Save Page As...", self)
save_file_action.setStatusTip("Save current page to file")
file_menu.addAction(save_file_action)

(保存文件功能)

def save_file(self):
    filename, _ = QFileDialog.getSaveFilename(self, "Save Page As", "",
        "Hypertext Markup Language (*.htm *.html);;"    
        "All files(*.*)")

    if filename:
        html = self.browser.page().mainFrame().toHtml()
        with open(filename, 'w') as f:
            f.write(html)

谢谢。

【问题讨论】:

    标签: python pyqt pyqt5 python-3.6 qwebengineview


    【解决方案1】:

    QtWebEnginetoHtml() 函数是异步的,因此它不会直接返回任何内容,但是您必须向它传递一个回调,以便在该函数中返回 html,将该过程异步转换为同步,我们使用QEventLoop 借助信号:

    import sys
    
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    from PyQt5.QtWebEngineWidgets import *
    
    class Browser(QMainWindow):
        htmlFinished = pyqtSignal()
        def __init__(self, *args, **kwargs):
            QMainWindow.__init__(self, *args, **kwargs)
            self.mHtml = ""
            self.view = QWebEngineView()
            self.setCentralWidget(self.view)
            self.view.setUrl(QUrl("http://www.google.com/"))
            file_menu = QMenu(self.menuBar())
            file_menu.setTitle("File")
            save_file_action = QAction(QIcon("disk--pencil.png"), "Save Page As...",self)
            file_menu.addAction(save_file_action)
            self.menuBar().addAction(file_menu.menuAction())
            save_file_action.triggered.connect(self.save_file)
    
        def callback(self, html):
            self.mHtml = html
            self.htmlFinished.emit()
    
        def save_file(self):
            filename, _ = QFileDialog.getSaveFileName(self, "Save Page As", "", "Hypertext Markup Language (*.htm *.html);;" "All files(*.*)")
            if filename:
                self.view.page().toHtml(self.callback)
                loop = QEventLoop()
                self.htmlFinished.connect(loop.quit)
                loop.exec_()
                with open(filename, 'w') as f:
                    f.write(self.mHtml)
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        w = Browser()
        w.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 非常感谢您的回答和详细解释!这非常有效。 (不幸的是,我没有足够的声誉来投票......)
    • @zsheryl 要将答案标记为正确,您无需享有声誉,只需按我的问题左侧的箭头即可,有关更多信息,请访问tour。这是最好的感谢方式。
    猜你喜欢
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多