Ищете удобную библиотеку Python GUI для рендеринга HTML
Я ищу Python GUI, который мог бы отображать HTML.
Моя минимальная проблема - написать простой веб-браузер. Моя максимальная проблема заключается в том, чтобы иметь возможность манипулировать html-содержимым перед его рендерингом: для примера выберите только элемент "dive" и добавьте мой собственный контент.
Допустим, у меня есть функция модификации:
def modify(content):
def select(content, element):
"""
Not matter how
"""
return select(content, element)+"<div>My own content...</div>"
и я не хочу показывать пользователю результирующее представление (я знаю, как получить html-контент, но я не хочу показывать измененный html-текст. Я хотел бы точно отобразить (показать представление) измененное содержимое вместо оригинального.)
Я уже попробовал несколько библиотек GUI, и вот мои результаты:
- Ткинтер - я его установил. Но не удалось запустить ["Web-Browser-using-tkinter-and-python"] [1]
- WxWidgets - до сих пор не удалось установить все необходимые библиотеки в Ubuntu
- PyQt - У меня трудности из-за различий PyQt5 и PyQt4. Существует также разница между именами классов в руководствах на Си и именами классов в библиотеках Python. В любом случае я как-то пишу простой браузер, использующий PyQt5, но не в состоянии контролировать HTML-контент. (см. код ниже)
Уважаемые коллеги, можете ли вы порекомендовать мне любую удобную библиотеку для моей задачи или посоветовать, как управлять html-содержимым внутри моего Python-приложения Python? Смотрите код ниже:
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *
from PyQt5.QtGui import *
import sip
import sys
class tabdemo(QMainWindow):
def __init__(self):
super(tabdemo, self).__init__()
self.setAttribute(Qt.WA_DeleteOnClose)
self.tabs = QTabWidget()
self.tabs.setTabsClosable(True)
self.tabs.tabCloseRequested.connect(self.closeTab)
self.tab1 = QWidget()
self.tabWebView = []
self.lNameLine = []
self.tabs.addTab(self.tab1,"New Tab")
self.tab1UI(self.tab1)
self.setWindowTitle("PyQt https://pythonprogramminglanguage.com")
self.setCentralWidget(self.tabs)
self.showMaximized()
QShortcut(QKeySequence("Ctrl+T"), self, self.addTab)
def addTab(self):
tab = QWidget()
self.tabs.addTab(tab,"New Tab")
self.tab1UI(tab)
index = self.tabs.currentIndex()
self.tabs.setCurrentIndex( index + 1 )
#self.tabWebView[self.tabs.currentIndex()].load( QUrl('about:blank'))
def goBack(self):
index = self.tabs.currentIndex()
self.tabWebView[index].back()
def goNext(self):
index = self.tabs.currentIndex()
self.tabWebView[index].forward()
def goRefresh(self):
index = self.tabs.currentIndex()
self.tabWebView[index].reload()
def changePage(self):
index = self.tabs.currentIndex()
pageTitle = self.sender().title()[:15]
self.tabs.setTabText(index, pageTitle);
self.lNameLine[self.tabs.currentIndex()].setText(self.sender().url().url())
def load_started(self):
return
def tab1UI(self,tabName):
webView = QWebEngineView()
backButton = QPushButton("")
backIcon = QIcon()
backIcon.addPixmap(QPixmap("back.svg"))
backButton.setIcon(backIcon)
backButton.setFlat(True)
nextButton = QPushButton("")
nextIcon = QIcon()
nextIcon.addPixmap(QPixmap("next.svg"))
nextButton.setIcon(nextIcon)
nextButton.setFlat(True)
refreshButton = QPushButton("")
refreshIcon = QIcon()
refreshIcon.addPixmap(QPixmap("refresh.svg"))
refreshButton.setIcon(refreshIcon)
refreshButton.setFlat(True)
backButton.clicked.connect(self.goBack)
nextButton.clicked.connect(self.goNext)
refreshButton.clicked.connect(self.goRefresh)
self.newTabButton = QPushButton("+")
self.destroyTabButton = QPushButton("-")
self.tabWidget = QTabWidget()
nameLine = QLineEdit()
nameLine.returnPressed.connect(self.requestUri)
tabGrid = QGridLayout()
tabGrid.setContentsMargins(0,0,0,0)
navigationFrame = QWidget()
navigationFrame.setMaximumHeight(32)
navigationGrid = QGridLayout(navigationFrame)
navigationGrid.setSpacing(0)
navigationGrid.setContentsMargins(0,0,0,0)
navigationGrid.addWidget(backButton,0,1)
navigationGrid.addWidget(nextButton,0,2)
navigationGrid.addWidget(refreshButton,0,3)
navigationGrid.addWidget(nameLine,0,4)
tabGrid.addWidget(navigationFrame)
webView = QWebEngineView()
htmlhead = "<head><style>body{ background-color: #fff; }</style></head><body></body>";
webView.setHtml(htmlhead)
#webView.loadProgress.connect(self.loading)
webView.loadFinished.connect(self.changePage)
frame = QFrame()
frame.setFrameStyle(QFrame.Panel)
gridLayout = QGridLayout(frame);
#gridLayout.setObjectName(QStringLiteral("gridLayout"));
gridLayout.setContentsMargins(0, 0, 0, 0);
gridLayout.addWidget(webView, 0, 0, 1, 1);
frame.setLayout(gridLayout)
self.tabWebView.append(webView)
self.tabWidget.setCurrentWidget(webView)
self.lNameLine.append(nameLine)
tabGrid.addWidget(frame)
tabName.setLayout(tabGrid)
def tab2UI(self):
vbox = QVBoxLayout()
tbl1 = QTableWidget()
tbl1.setRowCount(5)
tbl1.setColumnCount(5)
vbox.addWidget(tbl1)
tbl1.setItem(0, 0, QTableWidgetItem("1")) # row, col
self.tab2.setLayout(vbox)
def requestUri(self):
if self.tabs.currentIndex() != -1:
urlText = self.lNameLine[self.tabs.currentIndex()].text()
##########################
# no protocol?
if 'http' not in urlText:
self.lNameLine[self.tabs.currentIndex()].setText( 'https://' + urlText)
url = QUrl(self.lNameLine[self.tabs.currentIndex()].text())
print(self.tabs.currentIndex())
if url.isValid():
self.tabWebView[self.tabs.currentIndex()].load(url)
else:
print("Url not valid")
else:
print("No tabs open, open one first.")
def closeTab(self,tabId):
print(tabId)
del self.lNameLine[tabId]
del self.tabWebView[tabId]
self.tabs.removeTab(tabId)
def main():
app = QApplication(sys.argv)
ex = tabdemo()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()