Skip to content

Commit 5bb3739

Browse files
committed
Enhancements & Bug Fixes
- Line, and histogram data can now be accessed from their `data` methods. - Fixed a bug causing `maximize` to fail if a screen is not specified - Global events can now be coroutines or functions.
1 parent 2c27ad6 commit 5bb3739

4 files changed

Lines changed: 17 additions & 3 deletions

File tree

lightweight_charts/abstract.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ def __init__(self, chart: 'AbstractChart', name: str = None):
141141
self.name = name
142142
self.num_decimals = 2
143143
self.offset = 0
144+
self.data = pd.DataFrame()
144145

145146
def _set_interval(self, df: pd.DataFrame):
146147
if not pd.api.types.is_datetime64_any_dtype(df['time']):
@@ -216,20 +217,25 @@ def _single_datetime_format(self, arg):
216217
def set(self, df: pd.DataFrame = None, format_cols: bool = True):
217218
if df is None or df.empty:
218219
self.run_script(f'{self.id}.series.setData([])')
220+
self.data = pd.DataFrame()
219221
return
220222
if format_cols:
221223
df = self._df_datetime_format(df, exclude_lowercase=self.name)
222224
if self.name:
223225
if self.name not in df:
224226
raise NameError(f'No column named "{self.name}".')
225227
df = df.rename(columns={self.name: 'value'})
228+
self.data = df.copy()
226229
self._last_bar = df.iloc[-1]
227230
self.run_script(f'{self.id}.series.setData({js_data(df)})')
228231

229232
def update(self, series: pd.Series):
230233
series = self._series_datetime_format(series, exclude_lowercase=self.name)
231234
if self.name in series.index:
232235
series.rename({self.name: 'value'}, inplace=True)
236+
if series['time'] != self._last_bar['time']:
237+
self.data.loc[self.data.index[-1]] = self._last_bar
238+
self.data = pd.concat([self.data, series.to_frame().T], ignore_index=True)
233239
self._last_bar = series
234240
self.run_script(f'{self.id}.series.update({js_data(series)})')
235241

lightweight_charts/chart.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ def __init__(self, q, start_ev, exit_ev, loaded, emit_queue, return_queue, html,
3434
def create_window(self, width, height, x, y, screen=None, on_top=False, maximize=False):
3535
screen = webview.screens[screen] if screen is not None else None
3636
if maximize:
37-
width, height = screen.width, screen.height
37+
if screen is None:
38+
active_screen = webview.screens[0]
39+
width, height = active_screen.width, active_screen.height
40+
else:
41+
width, height = screen.width, screen.height
3842
self.windows.append(webview.create_window(
3943
'', html=self.html, js_api=self.callback_api,
4044
width=width, height=height, x=x, y=y, screen=screen,

lightweight_charts/util.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,11 @@ def __iadd__(self, other):
9999
return self
100100

101101
def _emit(self, *args):
102-
self._callable(*args) if self._callable else None
102+
if self._callable:
103+
if asyncio.iscoroutinefunction(self._callable):
104+
asyncio.create_task(self._callable(*args))
105+
else:
106+
self._callable(*args)
103107

104108

105109
class JSEmitter:

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
setup(
77
name='lightweight_charts',
8-
version='1.0.18',
8+
version='1.0.18.2',
99
packages=find_packages(),
1010
python_requires='>=3.8',
1111
install_requires=[

0 commit comments

Comments
 (0)