【问题标题】:Python PyQT - Web Browser | BookmarksPython PyQT - 网页浏览器 |书签
【发布时间】:2019-01-23 15:39:17
【问题描述】:

这是我之前删除的帖子的转贴。在第一篇文章中,我问是否有人知道使用 PyQT5 创建书签的方法,但是,最初,我没有用我的方式发布我现在遇到的问题。我的网络浏览器中有 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 函数中的最后几行代码。

最后几行代码:

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(无论使用哪个链接)。书签功能:

将网站添加到书签.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.stackoverflow.com'
        self.bookmarks_write = pickle.dump(bookmarks, bookmarks_open)
        bookmarks_open.close()
        self.create_bookmarks()
        print('Crash - Did not load bookmarks')

创建书签“按钮”,按下时打开该网站的新标签。

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 行并且我没有向该“按钮”添加任何功能,那么一切都会启动并正常工作,没有任何错误。它存储并可以加载书签。但是,当添加该行时,它会崩溃并且不会创建按钮(应用程序不会退出,因为有一个捕获错误的异常语句 - 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()))

最初我使用此功能通过“双击”标签栏来打开标签:

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

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

截图作为解释:


链接未添加到书签.txt

链接添加到bookmarks.txt

Pickle 会在 .txt 中转储链接

运行“except”语句,而trigger.connect行没有被注释掉。

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

【问题讨论】:

    标签: python pyqt pyqt5 bookmarks qwebengineview


    【解决方案1】:

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

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

    【讨论】:

    • 如何删除一些书签项目?
    猜你喜欢
    • 2023-03-09
    • 2014-07-10
    • 2014-07-09
    • 2020-06-15
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多