Python PyQT - 网页浏览器 |书签

Python PyQT - Web Browser | Bookmarks

这是我之前删除的 post 的重新post。在第一个 post 中,我问是否有人知道使用 PyQT5 创建书签的方法,但是,最初,我并没有 post 我现在遇到的问题,用我的方法。我的网络浏览器中有 3 个工具栏。

  1. 对于附加按钮,如 - 退出、最小化、最大化等。
  2. 用于网络导航。
  3. 所有书签都是使用 QToolBar() 的实例创建的。

书签工具栏代码

self.bookmark_bar = QToolBar('Bookmark')
self.bookmark_bar.setIconSize(QSize(12, 12))
self.bookmark_bar.setMovable(False)
self.addToolBar(self.bookmark_bar)

创建工具栏后添加按钮,因为那里有很多代码我将只显示最终结果作为屏幕截图和 init[= 中的最后几行代码78=]函数。

最后几行代码:

self.add_new_tab(QUrl('http://www.google.com'), 'Home Page')
self.bookmarks_load()
self.show()
self.setWindowTitle('Tempo')

Web 浏览器本身一切正常,因为除书签外一切正常。代码行 'bookmarks_load()' 从 .txt 文件加载书签。至于现在在 .txt 文档中,书签是 youtube.com(使用哪个 link 并不重要)。书签功能:

将网站添加到 bookmark.txt

def Bookmark(self):
    try:
        qurl = QUrl(self.urlbar.text())
        print('Here we are using the QUrl toString method: %s ---> Type: %s' % (qurl.toString(), type(qurl)))
        url = qurl.toString()
        print('Here we are storing the new string to a new variable: %s ---> Type: %s' % (url, type(url)))
        b = open(os.path.join('bookmarks', 'bookmarks.txt'), "wb")
        self.bookmarks_write = pickle.dump(url, b)
        b.close()
    except:
        print("Crash - Bookmarks not stored")

    self.bookmark_btn.setText("★")

从文档文件加载书签。

def bookmarks_load(self):
    try:
        bookmarks_open = open(os.path.join('bookmarks', 'bookmarks.txt'), 'rb')
        self.bookmarks_write = pickle.load(bookmarks_open)
        bookmarks_open.close()
        self.create_bookmarks()
    except:
        bookmarks_open = open(os.path.join('bookmarks', 'bookmarks.txt'), 'wb')
        bookmarks = 'http://www.whosebug.com'
        self.bookmarks_write = pickle.dump(bookmarks, bookmarks_open)
        bookmarks_open.close()
        self.create_bookmarks()
        print('Crash - Did not load bookmarks')

创建书签 'button',按下时打开一个包含该网站的新标签。

def create_bookmarks(self):
    bookmark_list = []
    try:
        for book in self.bookmarks_write.split():
            print(book)
            bookmark_list.append(book)
            print(bookmark_list)
    except:
        print("Something went wrong with the list")

    try:
        button = QAction(QIcon(os.path.join('images', 'tab_icon.PNG')), 'Open bookmark', self)
        button.triggered.connect(self.add_new_tab(QUrl(bookmark_list[0]), 'New'))
        self.bookmark_bar.addAction(button)
    except:
        print('Button is causing the error')

现在这是我开始遇到问题的部分。如果我删除 - triggered.connect 行并且不向 'button' 添加任何功能,则一切都会启动并运行,没有任何错误。它存储并可以加载书签。但是,当添加该行时,它会崩溃并且不会创建按钮(应用程序不会退出,因为有一个捕获错误的 except 语句 - pyqt 没有显示它是什么错误。)。这是 add_new_tab() 函数:

def add_new_tab(self, qurl=None, label='Blank'):

    if qurl is None:
        qurl = QUrl('')

    web_browser = QWebEngineView()
    web_browser.setUrl(qurl)
    web_browser.adjustSize()
    index = self.tabs.addTab(web_browser, label)

    self.tabs.setCurrentIndex(index)

    web_browser.urlChanged.connect(lambda qurl, web_browser=web_browser:
                                   self.update_urlbar(qurl, web_browser))

    web_browser.loadFinished.connect(lambda _, i=index, web_browser=web_browser:
                                     self.tabs.setTabText(i, web_browser.page().title()))

原来我是通过'double clicking'在标签栏上用这个功能打开标签的:

def tab_open_doubleclick(self, index):
    if index == -1:
        self.add_new_tab()

正如您在触发器上看到的那样 - 我确实将 link 作为 QUrl 传递,并且我确实添加了一个测试标签。我遇到的问题不知何故不想工作,我找不到原因,因为 Python PyQT5 没有显示错误,它只是用 return 代码关闭。

截图说明:


Link 未添加到 bookmarks.txt

Link 添加到 bookmarks.txt

Pickle 确实将 link 转储到 .txt

"except"语句是运行,而triggered.connect行没有注释掉。

应用程序继续 运行,但加载的书签按钮不存在。

在下面的示例中,我展示了如何添加书签的功能,因为它使用 QSettings 来存储数据,但是为此您必须使用 setOrganizationName()setOrganizationDomain()setApplicationName()。另外我添加了获取网页标题的功能。 BookMarkToolBar class 具有 bookmarkClicked 方法,该方法 returns url 与书签和标题关联。

from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets


class BookMarkToolBar(QtWidgets.QToolBar):
    bookmarkClicked = QtCore.pyqtSignal(QtCore.QUrl, str)

    def __init__(self, parent=None):
        super(BookMarkToolBar, self).__init__(parent)
        self.actionTriggered.connect(self.onActionTriggered)
        self.bookmark_list = []

    def setBoorkMarks(self, bookmarks):
        for bookmark in bookmarks:
            self.addBookMarkAction(bookmark["title"], bookmark["url"])

    def addBookMarkAction(self, title, url):
        bookmark = {"title": title, "url": url}
        fm = QtGui.QFontMetrics(self.font())
        if bookmark not in self.bookmark_list:
            text = fm.elidedText(title, QtCore.Qt.ElideRight, 150)
            action = self.addAction(text)
            action.setData(bookmark)
            self.bookmark_list.append(bookmark)

    @QtCore.pyqtSlot(QtWidgets.QAction)
    def onActionTriggered(self, action):
        bookmark = action.data()
        self.bookmarkClicked.emit(bookmark["url"], bookmark["title"])


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.defaultUrl = QtCore.QUrl()

        self.tabs = QtWidgets.QTabWidget()
        self.tabs.setTabsClosable(True)
        self.setCentralWidget(self.tabs)

        self.urlLe = QtWidgets.QLineEdit()
        self.urlLe.returnPressed.connect(self.onReturnPressed)
        self.favoriteButton = QtWidgets.QToolButton()
        self.favoriteButton.setIcon(QtGui.QIcon("images/star.png"))
        self.favoriteButton.clicked.connect(self.addFavoriteClicked)

        toolbar = self.addToolBar("")
        toolbar.addWidget(self.urlLe)
        toolbar.addWidget(self.favoriteButton)

        self.addToolBarBreak()
        self.bookmarkToolbar = BookMarkToolBar()
        self.bookmarkToolbar.bookmarkClicked.connect(self.add_new_tab)
        self.addToolBar(self.bookmarkToolbar)
        self.readSettings()

    def onReturnPressed(self):
        self.tabs.currentWidget().setUrl(QtCore.QUrl.fromUserInput(self.urlLe.text()))

    def addFavoriteClicked(self):
        loop = QtCore.QEventLoop()

        def callback(resp):
            setattr(self, "title", resp)
            loop.quit()

        web_browser = self.tabs.currentWidget()
        web_browser.page().runJavaScript("(function() { return document.title;})();", callback)
        url = web_browser.url()
        loop.exec_()
        self.bookmarkToolbar.addBookMarkAction(getattr(self, "title"), url)

    def add_new_tab(self, qurl=QtCore.QUrl(), label='Blank'):
        web_browser = QtWebEngineWidgets.QWebEngineView()
        web_browser.setUrl(qurl)
        web_browser.adjustSize()
        web_browser.urlChanged.connect(self.updateUlrLe)
        index = self.tabs.addTab(web_browser, label)
        self.tabs.setCurrentIndex(index)
        self.urlLe.setText(qurl.toString())

    def updateUlrLe(self, url):
        self.urlLe.setText(url.toDisplayString())

    def readSettings(self):
        setting = QtCore.QSettings()
        self.defaultUrl = setting.value("defaultUrl", QtCore.QUrl('http://www.google.com'))
        self.add_new_tab(self.defaultUrl, 'Home Page')
        self.bookmarkToolbar.setBoorkMarks(setting.value("bookmarks", []))

    def saveSettins(self):
        settings = QtCore.QSettings()
        settings.setValue("defaultUrl", self.defaultUrl)
        settings.setValue("bookmarks", self.bookmarkToolbar.bookmark_list)

    def closeEvent(self, event):
        self.saveSettins()
        super(MainWindow, self).closeEvent(event)


if __name__ == '__main__':
    import sys

    QtCore.QCoreApplication.setOrganizationName("eyllanesc.org")
    QtCore.QCoreApplication.setOrganizationDomain("www.eyllanesc.com")
    QtCore.QCoreApplication.setApplicationName("MyApp")
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())