QtWebEngineView не работает после компиляции с nuitka в Python

Вопрос или проблема

Взял часть кода из своего лаунчера. Я отображаю окно с сайтом через PySide2 и QWebEngineView. Всё работает хорошо в Python IDLE. Когда я компилирую с помощью nuitka, код выдает ошибку. Если я вывожу обычное окно без веб-модуля, всё работает нормально. Вот сам код:

from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
from PySide2.QtWebEngineWidgets import QWebEngineView
import logging

class Ui_MainWindow(object):
    
    def setupUi(self, MainWindow):

        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1000, 700)
        MainWindow.setBaseSize(QtCore.QSize(0, 0))

        # окно

        self.centralwidget = QtWidgets.QWidget(self)
        self.setCentralWidget(self.centralwidget)
        self.centralwidget.setObjectName("centralwidget")
        font = QtGui.QFont()
        font.setFamily("Segoe UI Semibold")

        self.main_window_frame = QtWidgets.QFrame(self.centralwidget)
        self.main_window_frame.setGeometry(QtCore.QRect(5, 10, 1000, 700))
        self.main_window_frame.setStyleSheet("background-color: rgb(54,57,62)")
        self.main_window_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.main_window_frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.main_window_frame.setObjectName("main_window_frame")

        # (не спрашивайте, что это)

        self.tab_menu_frame3 = QtWidgets.QFrame(self.main_window_frame)
        self.tab_menu_frame3.setGeometry(QtCore.QRect(0, 50, 1000, 650))
        self.tab_menu_frame3.setStyleSheet("background-color: rgb(54,57,62)")
        self.tab_menu_frame3.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.tab_menu_frame3.setFrameShadow(QtWidgets.QFrame.Raised)
        self.tab_menu_frame3.setObjectName("tab_menu_frame3")

        # веб-движок
        self.web_view = QWebEngineView(self.main_window_frame)
        self.web_view.setGeometry(QtCore.QRect(0, 50, 1000, 650))
        self.web_view.setUrl(QtCore.QUrl('https://example.com'))
        try:
            self.web_view.show()
        except Exception as e:
            logging.error(f"Ошибка: {e}")

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    try:
        w = MainWindow()
        w.show()
        sys.exit(app.exec_())
    except Exception as e:
        logging.error(f"Ошибка: {e}")

параметры nuitka:

python -m nuitka --onefile --windows-console-mode=force --enable-plugin=pyside2 --standalone  test.pyw

Консоль (cmd C:\test.exe) отображает следующее:

QtWebEngine ресурсы не найдены по адресу C:/Temp/ONEFIL~1/PySide2/resources... Пробуем родительскую директорию…

Qt WebEngine ресурсы не найдены по адресу C:/Temp/ONEFIL~1/PySide2... Пробуем директорию приложения…

Qt WebEngine ресурсы не найдены по адресу C:/Temp/onefile_9968_133754483410059208. Пробуем запасную директорию… Приложение

может НЕ работать.

Установленная директория локалей Qt WebEngine не найдена по адресу C:/Temp/ONEFIL~1/PySide2/translations\qtwebengine_locales

Пробуем директорию приложения…

Директория локалей Qt WebEngine не найдена по адресу C:/Temp/onefile_9968_133754483410059208\qtwebengine_locales. Пробуем

запасную директорию… Переводы могут быть неверными.

[1107/151902.529:ERROR: icu_util.cc (251)] Не удалось отобразить файл данных icu

image

Я пытался заменить код с PyQt5 на PySide2, потому что думал, что nuitka с PyQt5 компилирует qtwebengineview с ошибками, но ничего не изменилось. Пробовал менять параметры nuitka, ничего не изменилось. Я ожидал, что будет проще

Ответ или решение

При использовании QtWebEngineView в проекте на Python, который компилируется с помощью Nuitka, может возникнуть множество проблем, связанных с ресурсами Qt WebEngine. В данной ситуации вы столкнулись с ошибками выполнения, которые указывают на отсутствие необходимых ресурсов и локалей WebEngine. Рассмотрим более подробно, как решить данную проблему.

Проблема

При запуске скомпилированного приложения вы получаете сообщения об ошибках, свидетельствующие о том, что ресурсы Qt WebEngine не найдены в ожидаемых каталогах, что наводит на мысль о проблеме с корректной упаковкой файлов при компиляции.

Причины

  1. Отсутствие ресурсов WebEngine: Qt WebEngine требует доступ к определенному набору ресурсов (например, локализация, файлы данных и т.д.), которые должны быть включены в процесс сборки.
  2. Параметры компиляции: Используемые параметры Nuitka могут не включать все необходимые библиотеки и ресурсы.
  3. Файл ICU: Ошибка, связанная с миллиметрой ICU (International Components for Unicode), указывает на невозможность доступа к необходимым файлам.

Решения

Чтобы решить проблему, выполните следующие шаги:

1. Добавление необходимых ресурсов

Убедитесь, что вы добавляете все необходимые ресурсы Qt WebEngine в вашу сборку. Используйте флаг --include-data-file, чтобы явно указать файлы и директории, которые должны быть включены.

Пример команды может выглядеть следующим образом:

python -m nuitka --onefile --windows-console-mode=force --enable-plugin=pyside2 --standalone \
--include-data-file=path_to_qt_webengine_resources:PySide2/Qt/qwebengine_resources.pak \
--include-data-file=path_to_qt_webengine_locales:PySide2/Qt/qwebengine_locales \
test.pyw

Обратите внимание, что вам потребуется указать корректные пути к ресурсам на вашей системе.

2. Обработка ошибок в коде

Убедитесь, что в вашем коде обрабатываются все ошибки, связанные с загрузкой браузера. Например, можно вывести подробные сообщения в логах для лучшего понимания проблемы:

try:
    self.web_view.show()
except Exception as e:
    logging.error(f"Ошибка загрузки QWebEngineView: {e}")

3. Проверка наличия необходимых файлов

Прежде чем пересобирать приложение, убедитесь, что у вас есть все необходимые файлы платформы Qt WebEngine. Они обычно находятся в директории, где установлен Qt. Для помощи в этом, используйте команды поиска, чтобы убедиться в наличии файлов *.pak и локалей.

4. Обновление Nuitka и PySide2

Иногда проблемы могут быть вызваны версиями библиотек. Убедитесь, что вы используете последние версии Nuitka и PySide2. Обновите их, если это необходимо:

pip install --upgrade nuitka PySide2

5. Альтернативы

Если после выполнения всех шагов проблема сохранилась, возможно, вам стоит рассмотреть альтернативные способы упаковки вашего приложения, такие как PyInstaller или cx_Freeze, которые могут лучше справляться с упаковкой ресурсов Qt WebEngine.

Заключение

Сборка приложений с использованием PySide2 и Qt WebEngine может быть непростым процессом, однако, следуя приведённым рекомендациям, вы сможете успешно разрешить возникающие проблемы с ресурсами и локалями. Не забывайте фиксировать обнаруженные проблемы и ваши решения, так как это может оказаться полезным не только для вас, но и для других разработчиков в будущем.

Оцените материал
Добавить комментарий

Капча загружается...