加载内容时Qtwebengineview崩溃

发布于 2025-02-08 19:18:20 字数 10575 浏览 4 评论 0原文

我目前正在使用Pyqt5和Pyqtwebengine,我想创建一个小型浏览器。

操作系统和版本信息:

  • Windows 10
  • Python 3.9.6
  • Pyqt5 5.15.6
  • Pyqtwebengine 5.15.5

我使用PYQT5和PYQTWEBENGINE安装了所有这些软件包。

我遇到的问题是,例如,当我上Twitter时,视频未加载(图像为),并且视频中有一个错误消息。

另外,我只能滚动少量帖子,直到 python崩溃而没有任何错误在任何地方都打印出来(不仅是浏览器部分,而且完全是python:不是浏览器关闭自己,这就是为什么我找不到解决方案的原因对此)。

浏览器的代码如下所示:

import sys
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui, QtWebEngineWidgets


class BrowserWindow(QMainWindow):

    def __init__(self, *args, **kwargs):
        super(BrowserWindow, self).__init__(*args, **kwargs)

        # ADD WINDOW ELEMENTS
        # ADD TAB WIGDETS TO DISPLAY WEB TABS
        self.tabs = QTabWidget()
        self.tabs.setDocumentMode(True)
        self.tabs.setTabsClosable(True)
        self.setCentralWidget(self.tabs)

        # ADD DOUBLE CLICK EVENT LISTENER
        self.tabs.tabBarDoubleClicked.connect(self.tab_open_doubleclick)
        # ADD TAB CLOSE EVENT LISTENER
        self.tabs.tabCloseRequested.connect(self.close_current_tab)
        # ADD ACTIVE TAB CHANGE EVENT LISTENER
        self.tabs.currentChanged.connect(self.current_tab_changed)

        # ADD NAVIGATION TOOLBAR
        navtb = QToolBar("Navigation")
        navtb.setIconSize(QtCore.QSize(16, 16))
        self.addToolBar(navtb)

        # ADD BUTTONS TO NAVIGATION TOOLBAR
        # PREVIOUS WEB PAGE BUTTON
        back_btn = QAction(QtGui.QIcon('arrow back.png'), "Back", self)
        back_btn.setStatusTip("Back to previous page")
        navtb.addAction(back_btn)
        # NAVIGATE TO PREVIOUS PAGE
        back_btn.triggered.connect(lambda: self.tabs.currentWidget().back())

        # NEXT WEB PAGE BUTTON
        next_btn = QAction(QtGui.QIcon('arrow next.png'), "Forward", self)
        next_btn.setStatusTip("Forward to next page")
        navtb.addAction(next_btn)
        # NAVIGATE TO NEXT WEB PAGE
        next_btn.triggered.connect(lambda: self.tabs.currentWidget().forward())

        # REFRESH WEB PAGE BUTTON
        reload_btn = QAction(QtGui.QIcon('refresh.png'), "Reload", self)
        reload_btn.setStatusTip("Reload page")
        navtb.addAction(reload_btn)
        # RELOAD WEB PAGE
        reload_btn.triggered.connect(lambda: self.tabs.currentWidget().reload())

        # HOME PAGE BUTTON
        home_btn = QAction(QtGui.QIcon('home.png'), "Home", self)
        home_btn.setStatusTip("Go home")
        navtb.addAction(home_btn)
        # NAVIGATE TO DEFAULT HOME PAGE
        home_btn.triggered.connect(self.navigate_home)

        # ADD SEPARATOR TO NAVIGATION BUTTONS
        navtb.addSeparator()

        # ADD LINE EDIT TO SHOW AND EDIT URLS
        self.urlbar = QLineEdit()
        navtb.addWidget(self.urlbar)
        # LOAD URL WHEN ENTER BUTTON IS PRESSED
        self.urlbar.returnPressed.connect(self.navigate_to_url)
        self.urlbar.mousePressEvent = lambda _ : self.urlbar.selectAll()

        # ADD STYLESHEET TO CUSTOMIZE YOUR WINDOWS
        self.setStyleSheet("""QWidget{
        background-color: white;
        color: rgb(48, 48, 48);
        }
        QTabWidget::pane { /* The tab widget frame */
            border-top: 2px solid rgb(255, 255, 255);
            position: absolute;

            color: rgb(90, 90, 90);
            padding: 5px;
        }

        QTabWidget::tab-bar {
            alignment: left;
        }

        /* Style the tab using the tab sub-control. Note that
            it reads QTabBar _not_ QTabWidget */
        QLabel, QToolButton {
            background: rgb(255, 255, 255);
            border: 2px solid rgb(255, 255, 255);
            /*border-bottom-color: #C2C7CB; /* same as the pane color */
            border-radius: 3px;
            min-width: 8ex;
            padding: 5px;
            margin-right: 2px;
            color: rgb(50, 50, 50);
        }

        QLabel:hover, QToolButton::hover {
            background: white;
            border: 2px solid rgb(0, 36, 36);
            background-color: white;
        }

        QTabBar::tab{
            border-radius: 3px;
            min-width: 8ex;
            padding: 5px;
            margin-right: 2px;
            color: rgb(50, 50, 50);
            background:#e0e0e0;
        }

        QTabBar::tab:selected, QTabBar::tab:hover:selected{
            background:white;
            background-color:white;
            border-bottom-width:0px;
            border-bottom-left-radius:0px;
            border-bottom-right-radius:0px;
        }
        
        QTabBar::tab:hover {
            background:#ededed;
            background-color:#ededed;
            border-color:#ededed;
        }

        QLineEdit {
            border: 2px solid rgb(0, 36, 36);
            border-radius: 3px;
            padding: 5px;
            background-color: white;
            color: rgb(50, 50, 50);
        }
        QLineEdit:hover {
            border: 2px solid rgb(0, 66, 124);
        }
        QLineEdit:focus{
            border: 2px solid rgb(0, 136, 255);
        }
        QPushButton{
            background: rgb(49, 49, 49);
            border: 2px solid rgb(0, 36, 36);
            background-color: rgb(0, 36, 36);
            padding: 5px;
            border-radius: 10px;
        }""")

        #label = Homepage
        self.add_new_tab(QtCore.QUrl('https://duckduckgo.com/'), 'Homepage')

        # SHOW MAIN WINDOW
        self.show()

    # ############################################
    # FUNCTIONS
    ##############################################
    # ADD NEW WEB TAB
    def add_new_tab(self, qurl=None, label="Blank"):
        # Check if url value is blank
        if qurl is None:
            qurl = QtCore.QUrl('')#pass empty string to url

        # Load the passed url
        browser = QtWebEngineWidgets.QWebEngineView()
        browser.setUrl(qurl)

        # ADD THE WEB PAGE TAB
        i = self.tabs.addTab(browser, label)
        self.tabs.setCurrentIndex(i)

        # ADD BROWSER EVENT LISTENERS
        # On URL change
        browser.urlChanged.connect(lambda qurl, browser=browser:
                                self.update_urlbar(qurl, browser))
        # On loadfinished
        browser.loadFinished.connect(lambda _, i=i, browser=browser:
                                    self.tabs.setTabText(i, browser.page().title()))

    # ADD NEW TAB ON DOUBLE CLICK ON TABS
    def tab_open_doubleclick(self, i):
        if i == -1:  # No tab under the click
            self.add_new_tab()

    # CLOSE TABS 
    def close_current_tab(self, i):
        if self.tabs.count() < 2: #Only close if there is more than one tab open
            return

        self.tabs.removeTab(i)

    # UPDATE URL TEXT WHEN ACTIVE TAB IS CHANGED
    def update_urlbar(self, q, browser=None):
        #q = QURL
        if browser != self.tabs.currentWidget():
            # If this signal is not from the current tab, ignore
            return

        self.urlbar.setText(q.toString())
        self.urlbar.setCursorPosition(0)

    # ACTIVE TAB CHANGE ACTIONS
    def current_tab_changed(self, i):
        # i = tab index
        # GET CURRENT TAB URL
        qurl = self.tabs.currentWidget().url()
        # UPDATE URL TEXT
        self.update_urlbar(qurl, self.tabs.currentWidget())
        # UPDATE WINDOWS TITTLE
        self.update_title(self.tabs.currentWidget())

    # UPDATE WINDOWS TITTLE
    def update_title(self, browser):
        if browser != self.tabs.currentWidget():
            # If this signal is not from the current ACTIVE tab, ignore
            return

        title = self.tabs.currentWidget().page().title()
        self.setWindowTitle(title)

    # NAVIGATE TO PASSED URL
    def navigate_to_url(self):  # Does not receive the Url
        # GET URL TEXT
        q = QtCore.QUrl(self.urlbar.text())
        if q.scheme() == "":
            q = QtCore.QUrl('https://www.google.com/search?q='+self.urlbar.text().replace(' ', '+'))

        self.tabs.currentWidget().setUrl(q)

    # NAVIGATE TO DEFAULT HOME PAGE
    def navigate_home(self):
        self.tabs.currentWidget().setUrl(QtCore.QUrl("https://duckduckgo.com/"))

app = QApplication(sys.argv)
w = BrowserWindow()
app.exec_()

编辑:我在VSC终端中运行它,只是在CMD上尝试了,我遇到了错误:

[1436:6100:0617/142809.070:ERROR:cache_util_win.cc(21)] Unable to move the cache: AccÞs refusÚ. (0x5)
[1436:6100:0617/142809.084:ERROR:cache_util.cc(139)] Unable to move cache folder C:\Users\fabie\AppData\Local\python\QtWebEngine\Default\GPUCache to C:\Users\fabie\AppData\Local\python\QtWebEngine\Default\old_GPUCache_000
[1436:6100:0617/142809.096:ERROR:disk_cache.cc(184)] Unable to create cache
[1436:6100:0617/142809.096:ERROR:shader_disk_cache.cc(606)] Shader Cache Creation failed: -2
[1436:6100:0617/142812.075:ERROR:service_worker_storage.cc(1575)] Failed to delete the database: Database IO error
[1436:1208:0617/142837.652:ERROR:leveldb_factory.cc(91)] Failed to open LevelDB database from C:\Users\fabie\AppData\Local\python\QtWebEngine\Default\IndexedDB\https_twitter.com_0.indexeddb.leveldb,IO error: C:\Users\fabie\AppData\Local\python\QtWebEngine\Default\IndexedDB\https_twitter.com_0.indexeddb.leveldb/LOCK: File currently in use. (ChromeMethodBFE: 15::LockFile::2)
[1436:1208:0617/142839.674:ERROR:leveldb_factory.cc(91)] Failed to open LevelDB database from C:\Users\fabie\AppData\Local\python\QtWebEngine\Default\IndexedDB\https_twitter.com_0.indexeddb.leveldb,IO error: C:\Users\fabie\AppData\Local\python\QtWebEngine\Default\IndexedDB\https_twitter.com_0.indexeddb.leveldb/LOCK: File currently in use. (ChromeMethodBFE: 15::LockFile::2)

无法加载的媒体的示例:

< a href =“ https://i.sstatic.net/l2syz.png” rel =“ nofollow noreferrer”>

编辑2:

因此在进行了一些工作之后,似乎存在本地存储/饲料的问题(我对此不了解):

我m为其他目的运行另一个QweBengineView,他显示 widget 我从Tradingview那里得到我不为此写HTML。实际上,这部分会抛出下面可以看到的JS警告或错误。

它们可以与以前描述的链接有关。

js: 2022-06-29T15:25:55.559Z:Common.LocalForage:IndexedDB is NOT available
js: 2022-06-29T15:25:55.816Z:ChartApi.Core:Cannot get studies_metadata, reason: Error: No available storage method found.
js: 2022-06-29T15:25:56.679Z:ChartApi.Core:Cannot update studies_metadata cache, reason: Error: No available storage method found.

I'm currently working with PyQt5 and PyQtWebEngine and I want to create a small browser.

OS and version info:

  • Windows 10
  • Python 3.9.6
  • PyQt5 5.15.6
  • PyQtWebEngine 5.15.5

I installed all these packages using pip for PyQt5 and PyQtWebEngine.

The problem I have is that when I go on Twitter for example, videos are not loaded (images are) and there is a error message on the video.

Also, I can scroll only few posts until python crashes without any error printed anywhere (not only the browser part, but python entirely: it's not the browser closing himself, that's why I can't find a solution to this).

The code of the browser is shown below:

import sys
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui, QtWebEngineWidgets


class BrowserWindow(QMainWindow):

    def __init__(self, *args, **kwargs):
        super(BrowserWindow, self).__init__(*args, **kwargs)

        # ADD WINDOW ELEMENTS
        # ADD TAB WIGDETS TO DISPLAY WEB TABS
        self.tabs = QTabWidget()
        self.tabs.setDocumentMode(True)
        self.tabs.setTabsClosable(True)
        self.setCentralWidget(self.tabs)

        # ADD DOUBLE CLICK EVENT LISTENER
        self.tabs.tabBarDoubleClicked.connect(self.tab_open_doubleclick)
        # ADD TAB CLOSE EVENT LISTENER
        self.tabs.tabCloseRequested.connect(self.close_current_tab)
        # ADD ACTIVE TAB CHANGE EVENT LISTENER
        self.tabs.currentChanged.connect(self.current_tab_changed)

        # ADD NAVIGATION TOOLBAR
        navtb = QToolBar("Navigation")
        navtb.setIconSize(QtCore.QSize(16, 16))
        self.addToolBar(navtb)

        # ADD BUTTONS TO NAVIGATION TOOLBAR
        # PREVIOUS WEB PAGE BUTTON
        back_btn = QAction(QtGui.QIcon('arrow back.png'), "Back", self)
        back_btn.setStatusTip("Back to previous page")
        navtb.addAction(back_btn)
        # NAVIGATE TO PREVIOUS PAGE
        back_btn.triggered.connect(lambda: self.tabs.currentWidget().back())

        # NEXT WEB PAGE BUTTON
        next_btn = QAction(QtGui.QIcon('arrow next.png'), "Forward", self)
        next_btn.setStatusTip("Forward to next page")
        navtb.addAction(next_btn)
        # NAVIGATE TO NEXT WEB PAGE
        next_btn.triggered.connect(lambda: self.tabs.currentWidget().forward())

        # REFRESH WEB PAGE BUTTON
        reload_btn = QAction(QtGui.QIcon('refresh.png'), "Reload", self)
        reload_btn.setStatusTip("Reload page")
        navtb.addAction(reload_btn)
        # RELOAD WEB PAGE
        reload_btn.triggered.connect(lambda: self.tabs.currentWidget().reload())

        # HOME PAGE BUTTON
        home_btn = QAction(QtGui.QIcon('home.png'), "Home", self)
        home_btn.setStatusTip("Go home")
        navtb.addAction(home_btn)
        # NAVIGATE TO DEFAULT HOME PAGE
        home_btn.triggered.connect(self.navigate_home)

        # ADD SEPARATOR TO NAVIGATION BUTTONS
        navtb.addSeparator()

        # ADD LINE EDIT TO SHOW AND EDIT URLS
        self.urlbar = QLineEdit()
        navtb.addWidget(self.urlbar)
        # LOAD URL WHEN ENTER BUTTON IS PRESSED
        self.urlbar.returnPressed.connect(self.navigate_to_url)
        self.urlbar.mousePressEvent = lambda _ : self.urlbar.selectAll()

        # ADD STYLESHEET TO CUSTOMIZE YOUR WINDOWS
        self.setStyleSheet("""QWidget{
        background-color: white;
        color: rgb(48, 48, 48);
        }
        QTabWidget::pane { /* The tab widget frame */
            border-top: 2px solid rgb(255, 255, 255);
            position: absolute;

            color: rgb(90, 90, 90);
            padding: 5px;
        }

        QTabWidget::tab-bar {
            alignment: left;
        }

        /* Style the tab using the tab sub-control. Note that
            it reads QTabBar _not_ QTabWidget */
        QLabel, QToolButton {
            background: rgb(255, 255, 255);
            border: 2px solid rgb(255, 255, 255);
            /*border-bottom-color: #C2C7CB; /* same as the pane color */
            border-radius: 3px;
            min-width: 8ex;
            padding: 5px;
            margin-right: 2px;
            color: rgb(50, 50, 50);
        }

        QLabel:hover, QToolButton::hover {
            background: white;
            border: 2px solid rgb(0, 36, 36);
            background-color: white;
        }

        QTabBar::tab{
            border-radius: 3px;
            min-width: 8ex;
            padding: 5px;
            margin-right: 2px;
            color: rgb(50, 50, 50);
            background:#e0e0e0;
        }

        QTabBar::tab:selected, QTabBar::tab:hover:selected{
            background:white;
            background-color:white;
            border-bottom-width:0px;
            border-bottom-left-radius:0px;
            border-bottom-right-radius:0px;
        }
        
        QTabBar::tab:hover {
            background:#ededed;
            background-color:#ededed;
            border-color:#ededed;
        }

        QLineEdit {
            border: 2px solid rgb(0, 36, 36);
            border-radius: 3px;
            padding: 5px;
            background-color: white;
            color: rgb(50, 50, 50);
        }
        QLineEdit:hover {
            border: 2px solid rgb(0, 66, 124);
        }
        QLineEdit:focus{
            border: 2px solid rgb(0, 136, 255);
        }
        QPushButton{
            background: rgb(49, 49, 49);
            border: 2px solid rgb(0, 36, 36);
            background-color: rgb(0, 36, 36);
            padding: 5px;
            border-radius: 10px;
        }""")

        #label = Homepage
        self.add_new_tab(QtCore.QUrl('https://duckduckgo.com/'), 'Homepage')

        # SHOW MAIN WINDOW
        self.show()

    # ############################################
    # FUNCTIONS
    ##############################################
    # ADD NEW WEB TAB
    def add_new_tab(self, qurl=None, label="Blank"):
        # Check if url value is blank
        if qurl is None:
            qurl = QtCore.QUrl('')#pass empty string to url

        # Load the passed url
        browser = QtWebEngineWidgets.QWebEngineView()
        browser.setUrl(qurl)

        # ADD THE WEB PAGE TAB
        i = self.tabs.addTab(browser, label)
        self.tabs.setCurrentIndex(i)

        # ADD BROWSER EVENT LISTENERS
        # On URL change
        browser.urlChanged.connect(lambda qurl, browser=browser:
                                self.update_urlbar(qurl, browser))
        # On loadfinished
        browser.loadFinished.connect(lambda _, i=i, browser=browser:
                                    self.tabs.setTabText(i, browser.page().title()))

    # ADD NEW TAB ON DOUBLE CLICK ON TABS
    def tab_open_doubleclick(self, i):
        if i == -1:  # No tab under the click
            self.add_new_tab()

    # CLOSE TABS 
    def close_current_tab(self, i):
        if self.tabs.count() < 2: #Only close if there is more than one tab open
            return

        self.tabs.removeTab(i)

    # UPDATE URL TEXT WHEN ACTIVE TAB IS CHANGED
    def update_urlbar(self, q, browser=None):
        #q = QURL
        if browser != self.tabs.currentWidget():
            # If this signal is not from the current tab, ignore
            return

        self.urlbar.setText(q.toString())
        self.urlbar.setCursorPosition(0)

    # ACTIVE TAB CHANGE ACTIONS
    def current_tab_changed(self, i):
        # i = tab index
        # GET CURRENT TAB URL
        qurl = self.tabs.currentWidget().url()
        # UPDATE URL TEXT
        self.update_urlbar(qurl, self.tabs.currentWidget())
        # UPDATE WINDOWS TITTLE
        self.update_title(self.tabs.currentWidget())

    # UPDATE WINDOWS TITTLE
    def update_title(self, browser):
        if browser != self.tabs.currentWidget():
            # If this signal is not from the current ACTIVE tab, ignore
            return

        title = self.tabs.currentWidget().page().title()
        self.setWindowTitle(title)

    # NAVIGATE TO PASSED URL
    def navigate_to_url(self):  # Does not receive the Url
        # GET URL TEXT
        q = QtCore.QUrl(self.urlbar.text())
        if q.scheme() == "":
            q = QtCore.QUrl('https://www.google.com/search?q='+self.urlbar.text().replace(' ', '+'))

        self.tabs.currentWidget().setUrl(q)

    # NAVIGATE TO DEFAULT HOME PAGE
    def navigate_home(self):
        self.tabs.currentWidget().setUrl(QtCore.QUrl("https://duckduckgo.com/"))

app = QApplication(sys.argv)
w = BrowserWindow()
app.exec_()

EDIT : I was running it in the VSC terminal, just tried on a cmd one and I got errors :

[1436:6100:0617/142809.070:ERROR:cache_util_win.cc(21)] Unable to move the cache: AccÞs refusÚ. (0x5)
[1436:6100:0617/142809.084:ERROR:cache_util.cc(139)] Unable to move cache folder C:\Users\fabie\AppData\Local\python\QtWebEngine\Default\GPUCache to C:\Users\fabie\AppData\Local\python\QtWebEngine\Default\old_GPUCache_000
[1436:6100:0617/142809.096:ERROR:disk_cache.cc(184)] Unable to create cache
[1436:6100:0617/142809.096:ERROR:shader_disk_cache.cc(606)] Shader Cache Creation failed: -2
[1436:6100:0617/142812.075:ERROR:service_worker_storage.cc(1575)] Failed to delete the database: Database IO error
[1436:1208:0617/142837.652:ERROR:leveldb_factory.cc(91)] Failed to open LevelDB database from C:\Users\fabie\AppData\Local\python\QtWebEngine\Default\IndexedDB\https_twitter.com_0.indexeddb.leveldb,IO error: C:\Users\fabie\AppData\Local\python\QtWebEngine\Default\IndexedDB\https_twitter.com_0.indexeddb.leveldb/LOCK: File currently in use. (ChromeMethodBFE: 15::LockFile::2)
[1436:1208:0617/142839.674:ERROR:leveldb_factory.cc(91)] Failed to open LevelDB database from C:\Users\fabie\AppData\Local\python\QtWebEngine\Default\IndexedDB\https_twitter.com_0.indexeddb.leveldb,IO error: C:\Users\fabie\AppData\Local\python\QtWebEngine\Default\IndexedDB\https_twitter.com_0.indexeddb.leveldb/LOCK: File currently in use. (ChromeMethodBFE: 15::LockFile::2)

Example of a media that can't be loaded:

enter image description here

EDIT 2 :

So after some work on it, it seems that there is a problem with local storage/forage (I don't have any knowledge about that) :

I'm running another QWebEngineView for other purposes, he shows widget that I get from TradingView so I don't write the html for it. Actually this part throws js warnings or erros that you can see below.

They could be linked to the ones described before.

js: 2022-06-29T15:25:55.559Z:Common.LocalForage:IndexedDB is NOT available
js: 2022-06-29T15:25:55.816Z:ChartApi.Core:Cannot get studies_metadata, reason: Error: No available storage method found.
js: 2022-06-29T15:25:56.679Z:ChartApi.Core:Cannot update studies_metadata cache, reason: Error: No available storage method found.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

银河中√捞星星 2025-02-15 19:18:20

日志消息看起来好像您正在两次启动应用程序,因此第二次启动发现数据库已经锁定了。

The log messages look like you are launching the app twice, so the second launch found the database already locked.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文