backtrader.bokeh.tab 源代码
#!/usr/bin/env python
"""
Tab base class.
Provides extensible tab architecture for creating custom tabs.
"""
Panel = None
BOKEH_AVAILABLE = False
try:
# Bokeh 3.x
from bokeh.models import TabPanel as Panel
BOKEH_AVAILABLE = True
except ImportError:
try:
# Bokeh 2.x
from bokeh.models.widgets import Panel
BOKEH_AVAILABLE = True
except ImportError:
try:
from bokeh.models import Panel
BOKEH_AVAILABLE = True
except ImportError:
pass
[文档]
class BokehTab:
"""Tab base class.
Abstract base class for creating custom tabs.
Subclasses must implement _is_useable and _get_panel methods.
Attributes:
_app: BacktraderBokeh application instance
_figurepage: Figure page instance
_client: Client instance (optional, for live mode)
_panel: Bokeh Panel instance
Example:
class MyCustomTab(BokehTab):
def _is_useable(self):
return True
def _get_panel(self):
from bokeh.models import Div
div = Div(text='<h1>My Content</h1>')
return div, 'My Tab'
"""
[文档]
def __init__(self, app, figurepage, client=None):
"""Initialize tab.
Args:
app: BacktraderBokeh application instance
figurepage: Figure page instance
client: Client instance (optional)
"""
self._app = app
self._figurepage = figurepage
self._client = client
self._panel = None
def _is_useable(self):
"""Check if tab is useable.
Subclasses must implement this method.
Returns:
bool: Whether tab is useable
"""
raise NotImplementedError("_is_useable needs to be implemented.")
def _get_panel(self):
"""Get tab content.
Subclasses must implement this method.
Returns:
tuple: (child_widget, title) - Child widget and title
"""
raise NotImplementedError("_get_panel needs to be implemented.")
[文档]
def is_useable(self):
"""Public interface: Check if tab is useable.
Returns:
bool: Whether tab is useable
"""
return self._is_useable()
[文档]
def get_panel(self):
"""Public interface: Get Bokeh Panel.
Returns:
Panel: Bokeh Panel instance
"""
if not BOKEH_AVAILABLE or Panel is None:
return None
child, title = self._get_panel()
self._panel = Panel(child=child, title=title)
return self._panel
@property
def strategy(self):
"""Get strategy instance."""
if self._figurepage is not None:
return getattr(self._figurepage, "strategy", None)
return None
@property
def scheme(self):
"""Get theme instance."""
if self._app is not None:
return getattr(self._app, "scheme", None)
return None