import numpy as np
from bokeh.layouts import column
from bokeh.plotting import figure, curdoc
from bokeh.models import Panel, Tabs, Div, ColumnDataSource, HoverTool
PLOT_WIDTH = 1000
PLOT_HEIGHT = 570
class Some_class:
def __init__(self):
self.__canvas_signal = None
self.__signal_src = None
curdoc().add_root(column(Tabs(tabs=[self.__draw_signal_gui()])))
def attr_change(self, attr, old, new):
print('attr change')
def __draw_signal_gui(self):
'''GUI for 'signal' tab'''
self.__signal_src = ColumnDataSource(data={'x': [], 'y':[], 'color':[], 'name':[]})
self.__signal_src.on_change("data", self.attr_change)
self.__canvas_signal = figure(plot_height=PLOT_HEIGHT, plot_width=PLOT_WIDTH,
x_axis_label='Number of dots',
y_axis_label='Amplitude',)
self.__canvas_signal.multi_line(xs='x', ys='y', source=self.__signal_src,
color='color', name='name',
legend_field='name')
return Panel(child=self.__canvas_signal, title="signal")
def add_signal(self, signal, **kwargs):
self.__signal_src.stream({'x':[np.arange(len(signal))], 'y':[signal],
'color':[kwargs['color']],
'name':[kwargs['name']]})
slen1 = 1000
ftone1 = .13
signal1 = np.sin(2 * np.pi * ftone1 * np.arange(slen1))
signal1_param = {'name': 'signal1', 'calc_spectrum':True, 'color': 'red',}
dataview = Some_class()
dataview.add_signal(signal1, **signal1_param)
signal1 += 1 # on_change didn't call
signal1 += 1 # on_change didn't call