- Fixed a bug that did not size the multi pane charts correctly. - Implementation of the ‘grid’ common method.
67 lines
2.3 KiB
Python
67 lines
2.3 KiB
Python
try:
|
|
import wx.html2
|
|
except ImportError:
|
|
pass
|
|
try:
|
|
from PyQt5.QtWebEngineWidgets import QWebEngineView
|
|
from PyQt5.QtWebChannel import QWebChannel
|
|
from PyQt5.QtCore import QObject
|
|
except ImportError:
|
|
pass
|
|
|
|
from lightweight_charts.js import LWC
|
|
|
|
|
|
class WxChart(LWC):
|
|
def __init__(self, parent, volume_enabled: bool = True, inner_width: float = 1.0, inner_height: float = 1.0):
|
|
try:
|
|
self.webview: wx.html2.WebView = wx.html2.WebView.New(parent)
|
|
except NameError:
|
|
raise ModuleNotFoundError('wx.html2 was not found, and must be installed to use WxChart.')
|
|
|
|
super().__init__(volume_enabled, inner_width=inner_width, inner_height=inner_height)
|
|
|
|
self.webview.AddScriptMessageHandler('wx_msg')
|
|
self._js_api_code = 'window.wx_msg.postMessage'
|
|
self.webview.Bind(wx.html2.EVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, lambda e: self._js_api.onClick(eval(e.GetString())))
|
|
|
|
self.webview.Bind(wx.html2.EVT_WEBVIEW_LOADED, self._on_js_load)
|
|
self.webview.SetPage(self._html, '')
|
|
|
|
def run_script(self, script): self.webview.RunScript(script)
|
|
|
|
def _on_js_load(self, e):
|
|
self.loaded = True
|
|
for func, args, kwargs in self.js_queue:
|
|
if 'SUB' in func:
|
|
c_id = args[0]
|
|
args = args[1:]
|
|
getattr(self._subcharts[c_id], func.replace('SUB', ''))(*args)
|
|
else:
|
|
getattr(self, func)(*args)
|
|
|
|
def get_webview(self): return self.webview
|
|
|
|
|
|
class QtChart(LWC):
|
|
def __init__(self, widget=None, volume_enabled: bool = True, inner_width: float = 1.0, inner_height: float = 1.0):
|
|
try:
|
|
self.webview = QWebEngineView(widget)
|
|
except NameError:
|
|
raise ModuleNotFoundError('QWebEngineView was not found, and must be installed to use QtChart.')
|
|
|
|
super().__init__(volume_enabled, inner_width=inner_width, inner_height=inner_height)
|
|
|
|
self.webview.loadFinished.connect(self._on_js_load)
|
|
self.webview.page().setHtml(self._html)
|
|
|
|
def run_script(self, script): self.webview.page().runJavaScript(script)
|
|
|
|
def _on_js_load(self):
|
|
self.loaded = True
|
|
for func, args, kwargs in self.js_queue:
|
|
getattr(super(), func)(*args, **kwargs)
|
|
|
|
def get_webview(self): return self.webview
|
|
|