self 인자 유무에 따른 그래프 에러 문의

안녕하십니까?

평범한 직장인으로 파이썬 코딩에 관심이 있어 꾸준히 학습을 진행 중에 있습니다.
현재 아래 코딩이 지금 검토하고 있는 코딩인데 어려움이 있어 이렇게 질문 드립니다.

하단 부분
@plotly_app.register(scatter)
def scatter():

에서 self 인자를 적용하면
def scatter(self):

그래프가 그려지지 않고 self를 제거하면 그래프가 잘 그려지는데 데코레이터를 아무리 수정해 봐도 해결이 잘 안되네요. 혹시 해결책이 있을까요? 메인위젯 내에서 self로 데이터를 인풋받아 그리기 때문에 self 변수는 반드시 필요한 상황입니다.

GUI나 함수 관련 아직 명확히 이해를 못하고 있는 것 같은데 어떤 것이 부족한지도 알려주시면 찾아보도록 하겠습니다.
감사합니다.

import numpy as np
import plotly.graph_objs as go
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets
from PyQt5 import QtCore, QtWebEngineCore, QtWebEngineWidgets
import plotly.offline as po

class PlotlySchemeHandler(QtWebEngineCore.QWebEngineUrlSchemeHandler):
def init(self, app):
super().init(app)
self.m_app = app

def requestStarted(self, request):
url = request.requestUrl()
name = url.host()
if self.m_app.verify_name(name):
fig = self.m_app.fig_by_name(name)
if isinstance(fig, go.Figure):
raw_html = ''
raw_html += ''
raw_html += ""
raw_html += po.plot(fig, include_plotlyjs=False, output_type="div")
raw_html += ""
buf = QtCore.QBuffer(parent=self)
request.destroyed.connect(buf.deleteLater)
buf.open(QtCore.QIODevice.WriteOnly)
buf.write(raw_html.encode())
buf.seek(0)
buf.close()
request.reply(b"text/html", buf)
return
request.fail(QtWebEngineCore.QWebEngineUrlRequestJob.UrlNotFound)
class PlotlyApplication(QtCore.QObject):
scheme = bplotly

def init(self, parent=None):
super().init(parent)
scheme = QtWebEngineCore.QWebEngineUrlScheme(PlotlyApplication.scheme)
QtWebEngineCore.QWebEngineUrlScheme.registerScheme(scheme)
self.m_functions = dict()

def init_handler(self, profile=None):
if profile is None:
profile = QtWebEngineWidgets.QWebEngineProfile.defaultProfile()
handler = profile.urlSchemeHandler(PlotlyApplication.scheme)
if handler is not None:
profile.removeUrlSchemeHandler(handler)

self.m_handler = PlotlySchemeHandler(self)
profile.installUrlSchemeHandler(PlotlyApplication.scheme, self.m_handler)

def verify_name(self, name):
return name in self.m_functions

def fig_by_name(self, name):
return self.m_functions.get(name, lambda: None)()

def register(self, name):
def decorator(f):
self.m_functions[name] = f
return f
return decorator

def create_url(self, name):
url = QtCore.QUrl()
url.setScheme(PlotlyApplication.scheme.decode())
url.setHost(name)
return url
plotly_app = PlotlyApplication()

class Widget(QtWidgets.QWidget):
def init(self, parent=None):
super().init(parent)

self.m_view = QtWebEngineWidgets.QWebEngineView()

combobox = QtWidgets.QComboBox()
combobox.currentIndexChanged[str].connect(self.onCurrentIndexChanged)
combobox.addItems(["scatter"])

vlay = QtWidgets.QVBoxLayout(self)
hlay = QtWidgets.QHBoxLayout()
hlay.addWidget(QtWidgets.QLabel("Select:"))
hlay.addWidget(combobox)
vlay.addLayout(hlay)
vlay.addWidget(self.m_view)
self.resize(640, 480)

@QtCore.pyqtSlot(str)
def onCurrentIndexChanged(self, name):
self.m_view.load(plotly_app.create_url(name))

@plotly_app.register("scatter")
def scatter():
t = np.arange(0, 2000, 1)
y = np.sin(t / 200)
fig = go.Figure(data=[{"type": "scattergl", "y": y}])
return fig
if name == main:
import sys

app = QtWidgets.QApplication(sys.argv)
plotly_app.init_handler()
w = Widget()
w.show()
sys.exit(app.exec_())

next450 327

2021년 1월 27일 1:37 오후

목록으로