Почему постоянно падает программа?

Пытаюсь разобраться в написании браузеров на PyQt5. По какой-то неизвестной мне причине постоянно падает ниже указанный код, хотя вроде бы все написано без ошибок.

Проблема в оборудовании или все же в коде где-то допущена ошибка?

import os
import sys
from PyQt5.Qt import *
from PyQt5.QtWebEngineWidgets import QWebEngineView

class AboutDialog(QDialog):
    def __init__(self, *args, **kwargs):
        super(AboutDialog, self).__init__(*args,**kwargs)

        QBtn = QDialogButtonBox.Ok

        self.buttonbox = QDialogButtonBox(QBtn)
        self.buttonbox.accepted.connect(self.accept)
        self.buttonbox.rejected.connect(self.reject)

        layout = QVBoxLayout()

        title = QLabel("Viola Browser")
        font = title.font()
        font.setPointSize(20)
        title.setFont(font)

        layout.addWidget(title)

        logo = QLabel()
        logo.setPixmap(QPixmap(os.path.join("images", "logo.png")))
        layout.addWidget(logo)

        layout.addWidget(QLabel("Version 0.1"))

        for i in range(0, layout.count()):

            layout.itemAt(i).setAlignment(Qt.AlignHCenter)

        layout.addWidget(self.buttonbox)

        self.setLayout(layout)

class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow,self).__init__(*args,**kwargs)

        self.browser = QWebEngineView()
        self.browser.setUrl(QUrl("https://google.com"))

        self.browser.urlChanged.connect(self.update_urlbar)
        self.browser.loadFinished.connect(self.update_title)
        self.setCentralWidget(self.browser)

        self.status = QStatusBar()
        self.setStatusBar(self.status)

        navtb = QToolBar("Navigation")
        navtb.setIconSize(QSize(16,16))
        self.addToolBar(navtb)

        back_btn = QAction(QIcon(os.path.join("images","arrow-180.png")), "Back", self)
        back_btn.setStatusTip("Back to previous page")
        back_btn.triggered.connect(self.browser.back)
        navtb.addAction(back_btn)

        next_btn = QAction(QIcon(os.path.join("images","arrow-000.png")), "Forward", self)
        next_btn.setStatusTip("Forward to previous page")
        next_btn.triggered.connect(self.browser.forward)
        navtb.addAction(next_btn)

        reload_btn = QAction(QIcon(os.path.join("images", "arrow-circle-315.png")), "Reload", self)
        reload_btn.setStatusTip("Reload page")
        reload_btn.triggered.connect(self.browser.reload)
        navtb.addAction(reload_btn)

        home_btn = QAction(QIcon(os.path.join("images", "home.png")), "Home", self)
        home_btn.setStatusTip("Go home")
        home_btn.triggered.connect(self.navigate_home)
        navtb.addAction(home_btn)

        navtb.addSeparator()
        self.httpsicon = QLabel()
        self.httpsicon.setPixmap(QPixmap(os.path.join("images", "lock-noss1.png")))
        navtb.addWidget(self.httpsicon)

        self.urlbar = QLineEdit()
        self.urlbar.returnPressed.connect(self.navigate_to_url)
        navtb.addWidget(self.urlbar)

        stop_btn = QAction(QIcon(os.path.join("images", "cross-circle.png")), "Stop", self)
        stop_btn.setStatusTip("Stop loading current page")
        stop_btn.triggered.connect(self.browser.stop)
        navtb.addAction(stop_btn)

        file_menu = self.menuBar().addMenu("&File")

        open_file_action = QAction(QIcon(os.path.join("images", "disk--arrow.png")), "Open file", self)
        open_file_action.setStatusTip("Open from file")
        open_file_action.triggered.connect(self.open_file)
        file_menu.addAction(open_file_action)

        help_menu = self.menuBar().addMenu("&Help")

        about_action = QAction(QIcon(os.path.join("images", "question.png")), "About browser", self)
        about_action.setStatusTip("Find out more about browser")
        about_action.triggered.connect(self.about)
        help_menu.addAction(about_action)





    def update_title(self):
        title = self.browser.page().title()
        self.setWindowTitle("%s - Viola" % title)

    def about(self):
        pass

    def open_file(self):
        filename, _ = QFileDialog.getOpenFileName(self,"Open file", "",
                                                  "*.htm *.html" 
                                                  "All files (*.*)")
        if filename:
            with open(filename, "r") as f:
                html = f.read()

            self.browser.setHtml(html)
            self.urlbar.setText(filename)

    def save_file(self):
        filename, _ = QFileDialog.getSaveFileName(self,"save page as", "",
                                                  "*.htm *.html" 
                                                  "All files (*.*)")

        if filename:
            html = self.browser.page().toHtml()
            with open(filename, "w") as f:
                f.write(html)

    def navigate_home(self):
        self.browser.setUrl(QUrl("https://google.com"))

    def navigate_to_url(self):
        q = QUrl(self.urlbar.text())
        if q.scheme() == "":
            q.setSheme("http")

        self.browser.setUrl(q)

    def update_urlbar(self, q ):
        if q.sheme() == "https":
            self.httpsicon.setPixmap(QPixmap(os.path.join("images", "lock-ss1.png")))
        else:
            self.httpsicon.setPixmap(QPixmap(os.path.join("images", "lock-noss1.png")))

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

app = QApplication(sys.argv)

window = MainWindow()
window.show()
sys.exit(app.exec_())


Ответы (1 шт):

Автор решения: S. Nick

Я не все проверил, но два места отметил для вашего внимания.

import os
import sys
from PyQt5.Qt import *
from PyQt5.QtWebEngineWidgets import QWebEngineView


class AboutDialog(QDialog):
    def __init__(self, *args, **kwargs):
        super(AboutDialog, self).__init__(*args,**kwargs)

        QBtn = QDialogButtonBox.Ok

        self.buttonbox = QDialogButtonBox(QBtn)
        self.buttonbox.accepted.connect(self.accept)
        self.buttonbox.rejected.connect(self.reject)

        layout = QVBoxLayout()

        title = QLabel("Viola Browser")
        font = title.font()
        font.setPointSize(20)
        title.setFont(font)

        layout.addWidget(title)

        logo = QLabel()
        logo.setPixmap(QPixmap(os.path.join("images", "logo.png")))
        layout.addWidget(logo)

        layout.addWidget(QLabel("Version 0.1"))

        for i in range(0, layout.count()):

            layout.itemAt(i).setAlignment(Qt.AlignHCenter)

        layout.addWidget(self.buttonbox)

        self.setLayout(layout)


class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow,self).__init__(*args,**kwargs)

        self.browser = QWebEngineView()
        self.browser.setUrl(QUrl("https://google.com"))

        self.browser.urlChanged.connect(self.update_urlbar)
        self.browser.loadFinished.connect(self.update_title)
        self.setCentralWidget(self.browser)

        self.status = QStatusBar()
        self.setStatusBar(self.status)

        navtb = QToolBar("Navigation")
        navtb.setIconSize(QSize(16,16))
        self.addToolBar(navtb)

        back_btn = QAction(QIcon(os.path.join("images","arrow-180.png")), "Back", self)
        back_btn.setStatusTip("Back to previous page")
        back_btn.triggered.connect(self.browser.back)
        navtb.addAction(back_btn)

        next_btn = QAction(QIcon(os.path.join("images","arrow-000.png")), "Forward", self)
        next_btn.setStatusTip("Forward to previous page")
        next_btn.triggered.connect(self.browser.forward)
        navtb.addAction(next_btn)

        reload_btn = QAction(QIcon(os.path.join("images", "arrow-circle-315.png")), "Reload", self)
        reload_btn.setStatusTip("Reload page")
        reload_btn.triggered.connect(self.browser.reload)
        navtb.addAction(reload_btn)

        home_btn = QAction(QIcon(os.path.join("images", "home.png")), "Home", self)
        home_btn.setStatusTip("Go home")
        home_btn.triggered.connect(self.navigate_home)
        navtb.addAction(home_btn)

        navtb.addSeparator()
        self.httpsicon = QLabel()
        self.httpsicon.setPixmap(QPixmap(os.path.join("images", "lock-noss1.png")))
        navtb.addWidget(self.httpsicon)

        self.urlbar = QLineEdit()
        self.urlbar.returnPressed.connect(self.navigate_to_url)
        navtb.addWidget(self.urlbar)

        stop_btn = QAction(QIcon(os.path.join("images", "cross-circle.png")), "Stop", self)
        stop_btn.setStatusTip("Stop loading current page")
        stop_btn.triggered.connect(self.browser.stop)
        navtb.addAction(stop_btn)

        file_menu = self.menuBar().addMenu("&File")

        open_file_action = QAction(QIcon(os.path.join("images", "disk--arrow.png")), "Open file", self)
        open_file_action.setStatusTip("Open from file")
        open_file_action.triggered.connect(self.open_file)
        file_menu.addAction(open_file_action)

        help_menu = self.menuBar().addMenu("&Help")

        about_action = QAction(QIcon(os.path.join("images", "question.png")), "About browser", self)
        about_action.setStatusTip("Find out more about browser")
        about_action.triggered.connect(self.about)
        help_menu.addAction(about_action)

    def update_title(self):
        title = self.browser.page().title()
        self.setWindowTitle("%s - Viola" % title)

    def about(self):
        pass

    def open_file(self):
# !!!
        filename, _ = QFileDialog.getOpenFileName(
            self,
            "Open file", 
            "images",
#            "*.htm *.html" 
#            "All files (*.*)"
            'HTML Files (*.html);;HTM Files (*.HTM)'               # +++
        )
        if filename:
            with open(filename, "r") as f:
                html = f.read()

            self.browser.setHtml(html)
            self.urlbar.setText(filename)

    def save_file(self):
        filename, _ = QFileDialog.getSaveFileName(self,"save page as", "",
                                                  "*.htm *.html" 
                                                  "All files (*.*)")

        if filename:
            html = self.browser.page().toHtml()
            with open(filename, "w") as f:
                f.write(html)

    def navigate_home(self):
        self.browser.setUrl(QUrl("https://google.com"))

    def navigate_to_url(self):
        q = QUrl(self.urlbar.text())
        if q.scheme() == "":
            q.setSheme("http")

        self.browser.setUrl(q)

    def update_urlbar(self, q ):
        print(f'q = {q}') # QtCore.QUrl('https://www.google.com/')
        print(f'q = {q.path()}')
# !!! scheme
#        if q.sheme() == "https":
        if q.scheme() == "https":                                        # +++
# +++        ^^^^^^                     установите свои изображения  vvvvvvv
            self.httpsicon.setPixmap(QPixmap(os.path.join("images", "cat.png")))
        else:
            self.httpsicon.setPixmap(QPixmap(os.path.join("images", "Blue.png")))

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

app = QApplication(sys.argv)

window = MainWindow()
window.show()
sys.exit(app.exec_())

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

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

→ Ссылка