如何将 load/display 一个 html 文件放入我的 QTextBrowser 小部件中?

How do I load/display an html file into my QTextBrowser widget?

我正在自学如何使用 PyQt5 在 python 中编写 UI 代码。我想做的一件事是将 html 文档保存在与我的应用程序相同的文件夹中并显示其内容。看起来 QTextBrowser 是 load/display html 文档的正确小部件,但我无法弄清楚要使用什么命令以及如何使用它。如果这是一个愚蠢的问题,我很抱歉,但我对 Python 和 UI 编码仍然是新手,所以我无法理解文档和我做错了什么。

QTextBrowser 的文档提到了用于加载文档的方法的 QUrl、setSource 和源。我已经尝试将我的 html 文档的名称放入其中的每一个中,但其中 none 有效。 userSet 是根据用户输入确定的数据集,用户输入和数据生成工作正常,因为我能够使用 QTableView 小部件显示 table 数据。

import sys
from PyQt5 import QtCore, QtGui, uic, QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox, QTableWidget, QTableWidgetItem

class MyApp(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)
        self.submitButton.clicked.connect(self.handleInput)
        self.htmlView = QtWidgets.QTextBrowser(self)

    def handleInput(self):
        #Display Hexbin
        p = figure(plot_width = 300, plot_height = 300)
        p.hexbin(userSet.day, userSet.score, size = 1)
        html = output_file("userHexbin.html")
        save(p)
        self.oLayout.addWidget(self.htmlView)
        self.htmlView.source("userHexbin.html")

我希望应用程序显示我保存在 userHexbin.html 的 hexbin 图,但我收到以下错误 - TypeError: source(self): too many arguments。不过我不知道我还应该把我的文件名放在哪里。

编辑:

from bokeh.plotting import figure, output_file, show, save
from bokeh.resources import CDN
import pandas as pd
import sys
from PyQt5 import QtCore, QtGui, uic, QtWidgets
from PyQt5.QtWidgets import *
app = QApplication([])
button = QPushButton('Submit')
def on_button_clicked():
    p = figure(plot_width = 300, plot_height = 300)
    data = {'Day':[0, 1, 2, 3, 0, 1], 'Num':[0, 0, 1, 1, 2, 3]}
    df = pd.DataFrame(data)
    p.hexbin(df.Day, df.Num, size = .5) 
    html = output_file("test.html")
    save(p)
    output = QTextBrowser()
    output.setSource(QtCore.QUrl.fromLocalFile("test.html"))

button.clicked.connect(on_button_clicked)
button.show()
app.exec_()

Qt 有命名其方法的约定:

  • getters:property()
  • 二传手:setProperty()

在您的情况下,source() 是您不想要的 getter,您必须使用 setSource()

另一方面,setSource() 需要 QUrl,因此您必须使用 QUrl.fromLocalFile(...).

从路径转换
self.htmlView.setSource(QtCore.QUrl.fromLocalFile("userHexbin.html"))

QTextBrowser 不支持 javascript 所以它不是显示它的正确小部件,在这种情况下我建议使用 QWebEngineView(安装它使用 pip install PyQtWebEngine),也没有必要创建文件,直接加载即可:

import pandas as pd
from bokeh import plotting, embed, resources
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        button = QtWidgets.QPushButton("Submit")
        self.m_output = QtWebEngineWidgets.QWebEngineView()

        button.clicked.connect(self.on_button_clicked)

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(button)
        lay.addWidget(self.m_output)
        self.resize(640, 480)

    @QtCore.pyqtSlot()
    def on_button_clicked(self):
        p = plotting.figure(plot_width=300, plot_height=300)
        data = {"Day": [0, 1, 2, 3, 0, 1], "Num": [0, 0, 1, 1, 2, 3]}
        df = pd.DataFrame(data)
        p.hexbin(df.Day, df.Num, size=0.5)
        html = embed.file_html(p, resources.CDN, "my plot")
        self.m_output.setHtml(html)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    w = Widget()
    w.show()

    sys.exit(app.exec_())