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 오후