3

我正在尝试将绘图图嵌入到 PyQt5 webengine 视图中。我能够使用以下方法做到这一点:

以交互模式在 qwebview 中打开 plotly

如果您阅读它,该文章解释说您在使用 webengine 视图时不能直接在 HTML 中包含 javascript(它在加载超过 2 MB 的文件时会出现问题)。但是,我正在尝试使 javascript 的源是 plotly-min.js 的本地副本(保存在项目文件夹中),以便使用该程序的任何人都不需要互联网连接来查看图表它生成。我试图在 html 上遵循一些示例,但无济于事。

可用于 Internet 连接的原始代码是:

raw_html = '<html><head><meta charset="utf-8" />'
raw_html += '<script src="https://cdn.plot.ly/plotly-latest.min.js"></script></head>'
raw_html += '<body>'
raw_html += plot(fig, include_plotlyjs=False, output_type='div')
raw_html += '</body></html>'

temp_view = QWebEngineView()
temp_view.setHtml(graph)

如果我理解正确,我需要更改这部分:

<script src="https://cdn.plot.ly/plotly-latest.min.js">

我已经尝试过:

<script type="text/javascript" src="file:///C:/Users/UserName/PycharmProjects/ProjectFolder/plotly-latest.min.js"></script>

老实说,我不知道 HTML。这是代码中唯一的 HTML(其余在 Python 3 中)。有谁知道为什么上述可能不起作用以及我需要改变什么?我怀疑我可能会以某种方式遇到上述问题所引用的 2 MB 限制,因为我在网上找到的关于如何在 HTML 中引用本地文件的不同变体似乎并没有改变任何东西。

4

2 回答 2

5

许多浏览器出于安全原因禁用本地文件的加载,但如以下论坛所述,您可以通过以下方式启用该功能:

sys.argv.append("--disable-web-security")

假设 .js 在您的 .py 文件旁边:

.
├── main.py
└── plotly-latest.min.js

您可以使用以下示例:

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

import plotly
import plotly.graph_objs as go

sys.argv.append("--disable-web-security")
app = QApplication(sys.argv)

x1 = [10, 3, 4, 5, 20, 4, 3]
trace1 = go.Box(x = x1)
layout = go.Layout(showlegend = True)
data = [trace1]

fig = go.Figure(data=data, layout = layout)

path = QDir.current().filePath('plotly-latest.min.js') 
local = QUrl.fromLocalFile(path).toString()

raw_html = '<html><head><meta charset="utf-8" />'
raw_html += '<script src="{}"></script></head>'.format(local)
raw_html += '<body>'
raw_html += plotly.offline.plot(fig, include_plotlyjs=False, output_type='div')
raw_html += '</body></html>'

view = QWebEngineView()
view.setHtml(raw_html)
view.show()

sys.exit(app.exec_())

在此处输入图像描述

于 2017-10-10T03:51:55.197 回答
1

我在使用 NVIDIA 驱动程序的 Ubuntu 16.04 / 18.04 下运行 @eyllanesc 的示例时遇到问题。

首先我不得不降级PyQt5 5.10.15.10.0避免:

[0525/114545.216138:WARNING:stack_trace_posix.cc(648)] Failed to open file: /home/tmp/.gl5Qb0Tf (deleted)
  Error: Datei oder Verzeichnis nicht gefunden
Could not find QtWebEngineProcess
[3032:3032:0525/114545.495351:FATAL:zygote_host_impl_linux.cc(182)] Check failed: ReceiveFixedMessage(fds[0], kZygoteBootMessage, sizeof(kZygoteBootMessage), &boot_pid). 
...

但这应该在未来解决PyQt5 5.11

第二个问题是着色器(ubuntu 16.04)的链接:

QOpenGLShaderProgram::uniformLocation(qt_Matrix): shader program is not linked
QOpenGLShaderProgram: could not create shader program
QOpenGLShader: could not create shader
QOpenGLShader: could not create shader
shader compilation failed: 

在下:ubuntu 18.04_VirtualBox

Received signal 11 SEGV_MAPERR 000000000000
#0 0x7faa83f029a5 <unknown>
#1 0x7faa82c42501 <unknown>
#2 0x7faa83f02d3d <unknown>
#3 0x7faa9228a890 <unknown>
  r8: 0000000000000001  r9: 0000000002d5d3d0 r10: 0000000000000002 r11: 00007faa8ec4a000
 r12: 0000000002d386b0 r13: 0000000002d59b50 r14: 0000000000000000 r15: 00007faa8ed3b280
  di: 0000000000001f01  si: 00007faa8ed3d210  bp: 0000000002d52e40  bx: 0000000000000001
  dx: 0000000002e52220  ax: 0000000002e52220  cx: 0000000000000000  sp: 00007ffce38c2b78
  ip: 0000000000000000 efl: 0000000000010202 cgf: 002b000000000033 erf: 0000000000000014
 trp: 000000000000000e msk: 0000000000000000 cr2: 0000000000000000
[end of stack trace]
Calling _exit(1). Core file will not be generated.

这可以通过遵循dcortesi修复 4 年前的 Ubuntu 错误的建议来解决:

if sys.platform.startswith( 'linux' ) :
    from OpenGL import GL

把它们放在一起:

requirements.txt

PyQt5 == 5.10.0
PyOpenGL
plotly

webview.py

import sys

if sys.platform.startswith( 'linux' ) :
    from OpenGL import GL

from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtCore import QDir, QUrl

import plotly
import plotly.graph_objs as go

sys.argv.append("--disable-web-security")
app = QApplication(sys.argv)

x1 = [10, 3, 4, 5, 20, 4, 3]
trace1 = go.Box(x = x1)
layout = go.Layout(showlegend = True)
data = [trace1]

fig = go.Figure(data=data, layout = layout)

path = QDir.current().filePath('plotly-latest.min.js') 
local = QUrl.fromLocalFile(path).toString()

raw_html = '<html><head><meta charset="utf-8" />'
raw_html += '<script src="{}"></script></head>'.format(local)
raw_html += '<body>'
raw_html += plotly.offline.plot(fig, include_plotlyjs=False, output_type='div')
raw_html += '</body></html>'

view = QWebEngineView()
view.setHtml(raw_html)
view.show()

sys.exit(app.exec_())

可以在这里下载最新的 plotly.js 。我用于plotly.js v1.38.0这个例子。

于 2018-05-25T17:09:03.200 回答