我有一个ColumnDataSource来描述DataTable的数据,我希望有一个事件可以在我编辑DataTable中的单元格时执行某些操作。我在ColumnDataSource的data属性上设置了事件,我希望得到属性的旧值和新值之间的差异。
问题是两个值都是相同的。编辑表格单元格后,如何获取新值和旧值?
我的代码:
from bokeh.models import ColumnDataSource, DataTable, TableColumn, StringEditor
from bokeh.plotting import figure, curdoc
from bokeh.layouts import column
def cluster_name_changed(attr, old, new):
print(old)
print(new)
cluster_field = 'CLUSTER'
table_clusters_source = ColumnDataSource(data=dict(cluster_no=[1, 2, 3]))
columns_clusters = [TableColumn(field='cluster_no',
title="Cluster Name",
editor=StringEditor())]
table_clusters = DataTable(source=table_clusters_source,
columns=columns_clusters,
width=300,
height=200,
editable=True)
table_clusters_source.on_change('data', cluster_name_changed)
curdoc().add_root(column(table_clusters))
输出是(当我将第三个单元格从“3”更新为“第三个”时):
{'cluster_no': [1, 2, 'third']}
{'cluster_no': [1, 2, 'third']}
old
和new
参数适用于简单的标量属性(即其值为数字,字符串,颜色等)。但是它们不能与ColumnDataSource一起工作,这是一个已知且有记录的限制(因为我没有随便的参考)。原因是为ColumnDataSource制作old
和new
函数会使事情变得非常缓慢并且会破坏内存使用。