Python PyQT — веб-браузер | Закладки

Это репост моего предыдущего поста, который я удалил. В первом посте я спрашивал, знает ли кто-нибудь способ создания закладок с помощью 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')

С самим веб-браузером все в порядке, все работает, кроме закладок. Строка кода bookmarks_load() загружает закладки из файла .txt. На данный момент в .txt документе закладка youtube.com (не имеет значения, какая ссылка используется). Функции закладок:

Добавить сайт в 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.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 не показывает ошибку, просто закрывается с кодом возврата.

Скриншоты в качестве пояснения:


Ссылка не добавлена ​​в bookmarks.txt

Ссылка не добавлена ​​в bookmarks.txt

Ссылка добавлена ​​в bookmarks.txt

Ссылка добавлена ​​в bookmarks.txt

Pickle сбрасывает ссылку в .txt

Pickle сбрасывает ссылку в .txt

Оператор "кроме" выполняется, а строка triggered.connect не комментируется.

Выполняется оператор exclude, а строка triggered.connect не закомментирована.

Приложение продолжает работать, но кнопок загруженных закладок нет. Пустая панель закладок


person Gromis    schedule 16.08.2018    source источник


Ответы (1)


В следующем примере я покажу, как добавить функциональность закладки, для этого используйте QSettings для хранения данных, но для этого вы должны использовать setOrganizationName(), setOrganizationDomain() и setApplicationName(). Также я добавил функционал получения заголовка веб-страницы. Класс BookMarkToolBar имеет метод bookmarkClicked, который возвращает URL-адрес, связанный с BookMark и заголовком.

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

введите здесь описание изображения

person eyllanesc    schedule 16.08.2018