首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在SSL中嵌入划线图:握手失败,PyQt5错误

在SSL中嵌入划线图:握手失败,PyQt5错误
EN

Stack Overflow用户
提问于 2019-07-17 02:01:19
回答 1查看 2.2K关注 0票数 2

我正在尝试构建一个GUI来帮助我的团队以信号的形式快速比较大量的测试数据。我设想了高度模块化的交互式绘图,其格式类似于Audacity。我正在用PyQt5构建图形用户界面,目前正在尝试决定在绘图中使用什么;我计划使用matplotlib,但对于预期的用途来说,它将非常笨重。Plotly和/或Dash似乎更有前途;然而,它们只在浏览器中显示交互式绘图,因此我需要使用GUI中嵌入的某种浏览器显示。因此,请使用QWebEngineView。

我的图形用户界面本身将在我开发的QTabWidget中的选项卡中包含绘图,而其他选项卡中填充的是占位符matplotlib绘图,我想要替换它们,因为它们缺乏交互性。我可以在浏览器中成功显示网页(google.com)。

在PyQt5图形用户界面的QTabWidget中成功显示QWebEngineView对象中的网页

但是,当我将它指向我的Dash plot的地址时(出于开发目的,我在另一个内核中运行的一个单独程序中创建了这个地址),它给出一个错误:这个站点不能提供安全连接:

虚线图不显示

代码语言:javascript
运行
复制
 On the GUI's Kernel, the error is "[29477:29512:0716/121826.555372:ERROR:ssl_client_socket_impl.cc(1050)] handshake failed; returned -1, SSL error code 1, net_error -107".

In the kernel running the dash plot, the message is: 
127.0.0.1 - - [16/Jul/2019 12:18:26] code 400, message Bad request version ('**À+À/À,À0̨̩À\x13À\x14\x00\x9c\x00\x9d\x00/\x005\x00')

127.0.0.1 - - [16/Jul/2019 12:18:26] "µ±ª~ÜÎÌDñB¤¦jËfM½;*÷hå¸GÛ¼i©Tè**À+À/À,À0̨̩ÀÀ/5" HTTPStatus.BAD_REQUEST -

这只在QTabsWidget中存在。Dash plot在单独的独立应用程序中显示良好(如下面提供的占位符Dash plot的工作代码)。

在简单的PyQt5图形用户界面中成功显示虚线图

我在谷歌上搜索了这个错误,但没有找到相关的信息。我不明白为什么这在第一个QWebEngineView上运行得很好,但当我将它指向我的破折线图时却失败了,特别是考虑到我能够在我精简的原型代码中查看url中的破折线图。

虚线图工作代码:

代码语言:javascript
运行
复制
import sys
import threading
from PyQt5 import QtWidgets
import dash
import dash_core_components as dcc
import dash_html_components as html


def run_dash(data, layout):
    app = dash.Dash()
    app.layout = html.Div(children=[
        html.H1(children='Hello Dash'),
        html.Div(children='''
            Dash: A web application framework for Python.
        '''),
        dcc.Graph(
            id='example-graph',
            figure={
                'data': data,
                'layout': layout
            })
        ])
    app.run_server(debug=False)


class MainWindow(QtWidgets.QMainWindow):
    pass

if __name__ == '__main__':
    data = [
        {'x': [1, 2, 3], 'y': [4, 1, 2], 'type': 'bar', 'name': 'SF'},
        {'x': [1, 2, 3], 'y': [2, 4, 5], 'type': 'bar', 'name': u'Montréal'},
    layout = {
        'title': 'Dash Data Visualization'
    }

    threading.Thread(target=run_dash, args=(data, layout), daemon=True).start()
    app = QtWidgets.QApplication(sys.argv)
    mainWin = MainWindow()
    mainWin.show()
    sys.exit(app.exec_())

在运行这段代码时,内核提供绘图的地址。在我的机器上,它是http://127.0.0.1:8050

原型GUI嵌入代码:

代码语言:javascript
运行
复制
import sys
from PyQt5.QtCore import *
from PyQt5.QtWebEngineWidgets import *
from PyQt5.QtWidgets import QApplication

app = QApplication(sys.argv)

web = QWebEngineView()
#web.load(QUrl("https://www.google.com"))
web.load(QUrl("http://127.0.0.1:8050"))
web.show()

sys.exit(app.exec ())

我的实际PyQt5图形用户界面中的代码片段:

代码语言:javascript
运行
复制
web = QWebEngineView()
# web.load(QUrl("https://www.google.com")) web.load(QUrl("https://127.0.0.1:8050/"))
web.show()
self.ui.TabsContainer.addTab(web, "QWebEngineView Object") 
# TabsContainer is a QTabsWidget

如何绕过阻止我在GUI中嵌入绘图的错误?

编辑:我认为这可能与QTabWidget有关,所以我编写了以下简单的代码来测试这一想法,我的Dash图显示得很好。然而,尽管它是以相同的方式构造的,但它不会显示在我需要它的主多线程GUI中。

代码语言:javascript
运行
复制
import sys
from PyQt5.QtCore import *
from PyQt5.QtWebEngineWidgets import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *


class CustomMainWindow(QMainWindow):  # MainWindow is a subclass of QMainWindow
    def __init__(self, *args, **kwargs):
        super(CustomMainWindow, self).__init__(*args, **kwargs)
#        a = 1

        self.setWindowTitle("Window Title")

        label = QLabel("Label")
        label.setAlignment(Qt.AlignCenter)
#        
        layout = QVBoxLayout()
#        layout.addWidget(Color('red'))
#        layout.addWidget(Color('green'))
        layout.addWidget(Color('blue'))

        TW = QTabWidget()


        web1 = QWebEngineView()
        web1.load(QUrl("http://www.google.com"))
        #web1.load(QUrl("http://127.0.0.1:8050"))

        web2 = QWebEngineView()
        web2.load(QUrl("http://127.0.0.1:8050"))

        TW.addTab(web1, 'web1')
        TW.addTab(web2, 'web2')
        layout.addWidget(TW)


        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)        

class Color(QWidget):

    def __init__(self, color, *args, **kwargs):
        super(Color, self).__init__(*args, **kwargs)
        self.setAutoFillBackground(True)

        palette = self.palette()
        palette.setColor(QPalette.Window, QColor(color))
        self.setPalette(palette)


app = QApplication(sys.argv)

CMWindow = CustomMainWindow()  # Instead of using QMainWindow, we now use our custom window subclassed from QMainWindow
CMWindow.show()
sys.exit(app.exec ())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-19 03:50:02

好吧,答案很简单:

在我发布的工作示例中,我加载了QUrl("http://127.0.0.1:8050")。在不起作用的代码中,我使用了https://。显然,Dash图没有使用https。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57063046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档