Вопрос или проблема
Взял часть кода из своего лаунчера. Я отображаю окно с сайтом через 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
Я пытался заменить код с PyQt5 на PySide2, потому что думал, что nuitka с PyQt5 компилирует qtwebengineview с ошибками, но ничего не изменилось. Пробовал менять параметры nuitka, ничего не изменилось. Я ожидал, что будет проще
Ответ или решение
При использовании QtWebEngineView
в проекте на Python, который компилируется с помощью Nuitka, может возникнуть множество проблем, связанных с ресурсами Qt WebEngine. В данной ситуации вы столкнулись с ошибками выполнения, которые указывают на отсутствие необходимых ресурсов и локалей WebEngine. Рассмотрим более подробно, как решить данную проблему.
Проблема
При запуске скомпилированного приложения вы получаете сообщения об ошибках, свидетельствующие о том, что ресурсы Qt WebEngine не найдены в ожидаемых каталогах, что наводит на мысль о проблеме с корректной упаковкой файлов при компиляции.
Причины
- Отсутствие ресурсов WebEngine: Qt WebEngine требует доступ к определенному набору ресурсов (например, локализация, файлы данных и т.д.), которые должны быть включены в процесс сборки.
- Параметры компиляции: Используемые параметры Nuitka могут не включать все необходимые библиотеки и ресурсы.
- Файл 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 может быть непростым процессом, однако, следуя приведённым рекомендациям, вы сможете успешно разрешить возникающие проблемы с ресурсами и локалями. Не забывайте фиксировать обнаруженные проблемы и ваши решения, так как это может оказаться полезным не только для вас, но и для других разработчиков в будущем.