Можно ли запустить javascript код canvas внутри pyqt5?

Мне стало интересно можно ли запустить javascript, который генерирует (работает с) canvas окном внутри PyQt5?

python

import sys
from PyQt5 import QtWidgets

class Test(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.resize(500, 500)
        
        lay = QtWidgets.QVBoxLayout(self)
        
        canvas_widget = QtWidgets.QWidget(self)
        canvas_widget.setStyleSheet('background:red;')
        
        lay.addWidget(canvas_widget)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = Test()
    w.show()
    sys.exit(app.exec_())

javascript

var canv = document.getElementById('canvas');
var ctx = canv.getContext('2d');

canv.width = window.innerWidth;
canv.height = window.innerHeight;

ctx.fillStyle = 'magenta'
ctx.fillRect(50,50,300,200)

ctx.arc(canv.width/2,canv.height/2,100,0,Math.PI)
ctx.fill()

Если да, то что мне для этого лучше всего сделать? Что нужно скачать (подключить).

Желательно объяснить как можно более детально.


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

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

то что предложил Александр, может выглядеть примерно так:

import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtCore import QTimer, QDateTime, QUrl


html = """
<html>
  <head>
    <meta charset="utf-8">
    <title>background-image</title>
    <style>
      body {
        background-image: url('file:///D:/_Qt/__Qt/image.jpg ');
        background-color: #c7b39b;               
      }
      p {
        color: #f00;
        font: bold italic 15pt 'Comic Sans MS';
      }
    </style>
  </head>
  <body>
    <p>Hello World</p>
  </body>
</html>
"""


def append():
    some_html = "<p>{}</p>".format(QDateTime.currentDateTime().toString())
    page.runJavaScript("document.body.innerHTML += '{}'".format(some_html)
    )


if __name__ == '__main__':
    app = QApplication(sys.argv)

    view = QWebEngineView()

    timer = QTimer()
    timer.timeout.connect(append)
    page = view.page()
    page.loadFinished.connect(lambda: timer.start(1000))

    page.setHtml(html, baseUrl=QUrl('file://'))                   

    view.resize(512, 384)
    view.show()
    sys.exit(app.exec_())

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

→ Ссылка