Как мне загрузить / отобразить html-файл в мой виджет QTextBrowser? - PullRequest
1 голос
/ 14 июня 2019

Я учу себя, как кодировать пользовательский интерфейс на python с PyQt5.Я хочу взять HTML-документ, сохраненный в той же папке, что и мое приложение, и отобразить его содержимое.Похоже, QTextBrowser был подходящим виджетом для загрузки / отображения html-документов, но у меня возникли проблемы с выяснением, какую команду использовать и как ее использовать.Извините, если это глупый вопрос, но я все еще плохо знаком с Python и кодированием пользовательского интерфейса, поэтому у меня возникают проблемы с пониманием документации и с тем, что я делаю неправильно.

Упоминается документация для QTextBrowserQUrl, setSource и source для способов загрузки документов.Я попытался поместить название моего HTML-документа в каждый из них, но ни один из них не работает.UserSet - это набор данных, определенный из пользовательского ввода, и пользовательский ввод и генерация данных работают нормально, потому что я смог отобразить таблицу данных с помощью виджета QTableView.

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, но я получаю следующую ошибку - Ошибка типа: источник (само): слишком много аргументов.Я не знаю, где еще я должен поставить название документа.

РЕДАКТИРОВАТЬ:

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_()

1 Ответ

2 голосов
/ 14 июня 2019

Qt имеет соглашения для именования своих методов:

  • геттеры: property()
  • сеттеры: setProperty()

В вашем случае, source() - это метод получения, который вам не нужен, вы должны использовать 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_())

enter image description here

...