2015-09-01 11 views
9

Ich versuche, Bokeh zu verwenden, um eine editierbare DataTable zu erstellen, die die Quelldaten aktualisiert, wenn die Daten bearbeitet werden. Ich habe mit dem Standard-DataTable-Beispiel here begonnen und das editierbare Kwarg auf true gesetzt. Hier ist, wo ich bin:Hinzufügen von Rückruf zu Bokeh DataTable

from datetime import date 
from random import randint 

from bokeh.models import ColumnDataSource, Callback 
from bokeh.models.widgets import DataTable, DateFormatter, TableColumn 
from bokeh.io import output_file, output_notebook, show, vform 
output_notebook() 
data = dict(dates=[date(2014, 3, i+1) for i in range(10)], 
      downloads=[randint(0, 100) for i in range(10)]) 

source = ColumnDataSource(data) 

columns = [TableColumn(field="dates", title="Date", formatter=DateFormatter()), 
      TableColumn(field="downloads", title="Downloads")] 

callback = Callback(args=dict(Source=source), code=""" 
     console.log('#cell edited')""") 

data_table = DataTable(source=source, columns=columns, width=400, height=280, editable=True) 
data_table.on_change(callback,source) 
show(vform(data_table)) 

Dies macht eine bearbeitbare Datentabelle, aber ich kann nicht herausfinden, wie den Callback erhält die Quelldaten zu aktualisieren oder die Quelldaten so zu konfigurieren, dass es automatisch tut Das. Ich dachte, es gab eine Möglichkeit, dies automatisch mit ColumnDataSource zu tun, und nach dem Versuch, einen Rückruf zu schreiben. Es scheint jedoch, dass die DataTable keine Callback-Option hat, aber es hat seltsamerweise ein on_change-Attribut.

Weiß jemand, wie man das macht?

Antwort

2

Der folgende Code erkennt das Ereignis beim Klicken (Auswählen) einer Zeile oder Zeilen. Ich habe ein console.log geschrieben, um die ausgewählten Zeilen auszugeben.

from datetime import date 
from random import randint 
import bokeh 
import bokeh.plotting 

data = dict(dates=[date(2014, 3, i+1) for i in range(10)], 
      downloads=[randint(0, 100) for i in range(10)]) 

source = bokeh.models.ColumnDataSource(data) 

columns = [bokeh.models.TableColumn(field="dates", title="Date", 
      formatter=bokeh.models.DateFormatter()), 
      bokeh.models.TableColumn(field="downloads", title="Downloads")] 

source.callback = bokeh.models.CustomJS(args=dict(source=source), code=""" 
     console.log('#Selected rows:'); 
     var indices = source.selected["1d"].indices; 
     for (var i = 0; i<indices.length; i++){ 
      console.log(i+":"+indices[i]); 
     } 
     """) 

data_table = bokeh.models.DataTable(source=source, columns=columns, 
            width=400, height=280, editable=True) 

bokeh.io.output_notebook() 
bokeh.io.show(data_table)