У меня есть достаточно сложное приложение, которое работает нормально. После обновления системы с Debian 11 до 12 компонент QWebEngineView показывает пустой экран (просто белое окно). Это работает внутри виртуальной среды, управляемой Poetry. Все пакеты внутри среды имеют последнюю версию. Все остальное в приложении работает без проблем.
Тестовый пример показан ниже. При запуске в системе Debian 12 с установленными собственными пакетами (без venv) тестовый пример работает нормально.
Когда это не удается, нет ни вывода, ни ошибок, ничего. Я даже не знаю, как это диагностировать.
#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtCore import QUrl
html = """
<!DOCTYPE html>
<html>
<body>
<h1>Test</h1>
</body>
</html>
"""
app = QApplication(sys.argv)
web = QWebEngineView()
web.setHtml(html)
web.show()
sys.exit(app.exec_())
ОБНОВЛЕНИЕ: я изменил тело тестового примера следующим образом:
app = QApplication(sys.argv)
def loadstart():
print("load started")
def loadfin():
print("load end")
def loadprog(n):
print(f"progress {n=}")
web = QWebEngineView()
web.loadStarted.connect(loadstart)
web.loadFinished.connect(loadfin)
web.loadProgress.connect(loadprog)
В рабочей среде:
$ ./web.py
load started
progress n=0
progress n=20
progress n=100
load end
В неудачной среде:
$ ./web.py
load started
progress n=0
progress n=100
Таким образом, в рабочей среде есть сигнал, вызываемый при нагрузке 20%, которого нет в сбойной среде; кроме того, сбойная среда достигает 100%, но никогда не вызывает loadFinished
Все еще пытаюсь понять, что происходит...
Нет, ничего. Я только что добавил web.setStyleSheet("background-color: red")
непосредственно перед строкой setHtml
, и теперь окно отображается красным, поэтому отображается виджет QWebEngineView: он просто не отображает никакого содержимого.
Я полагаю, что в Debian требуется тег «название». Может быть было возбуждено исключение
@AndreyZobov и рабочая, и нерабочая системы — это Debian. Никаких исключений не возникает.
Хорошо. Проверьте сигнал renderProcessTerminated(). ... def render_process_terminated (termination_type, exit_code): print (f'{termination_type =}, {exit_code =}') ... web.renderProcessTerminated.connect (render_process_terminated) ...
Спасибо Андрей. Рабочая версия не дает вывода (как и ожидалось); неудачный дает termination_type=2, exit_code=31
. Как я могу решить эту проблему?
Ответ из списка рассылки PyQt:
Похоже на эту проблему: https://bugreports.qt.io/browse/QTBUG-103969
Двоичный дистрибутив 5.15.2 не работает с более новой версией glibc. версии.
Единственные обходные пути, о которых я знаю, это пройти --disable-seccomp-filter-sandbox в качестве одного из аргументов для QApplication или для использования более новой версии WebEngine.
Вы по-прежнему не получаете вывода даже при запуске кода из терминала?