2017-08-11 103 views
1

我想我更改表中相应xsin(x)值尽快改变。 (运行此代码之前开始在CMD bokeh serve在背景虚化的动态变化值,生成HTML表格

from bokeh.client import push_session 
from bokeh.io import curdoc 
from bokeh.layouts import row 
from bokeh.models import ColumnDataSource 
from bokeh.models.widgets import DataTable, TableColumn 
import math 
curdoc().clear() 
x=[i for i in range(10)] 

def update_y(x): 
     y=[] 
     for i in x: 
      y.append(round(math.sin(int(i)),2)) 
     return y 

y=update_y(x) 
data=dict(x=x,y=y) 
source=ColumnDataSource(data) 
columns = [ TableColumn(field='x',title="x"),TableColumn(field='y',title="sin(x)") ] 
dadat= DataTable(source=source, columns=columns, width=600, height=400,editable=True) 

def update(attr,new,old): 
     print('1') 
     y=update_y(old['x']) 
     print('2') 
     source.data=dict(x=x,y=y) 
     print('3') 

source.on_change('data',update) 
curdoc().add_root(row(dadat)) 
ses=push_session(curdoc()) 
ses.show() 
ses.loop_until_closed() 

运行该代码,并改变x值之后,它改变为几分之一秒的值,将恢复并进入无限循环。

我认为这是因为source.on_change,因为它可能会触发时,源值被编辑在update函数内。有没有办法解决这个问题?

回答

0

初始化source先升后初始化每次发生变化,所以不会进入无限循环一次。 (观察update_table() function

from bokeh.client import push_session 
from bokeh.io import curdoc 
from bokeh.layouts import row 
from bokeh.models import ColumnDataSource 
from bokeh.models.widgets import DataTable, TableColumn 
curdoc().clear() 
#replaced `sin(x)` with `x+2` 
x=[i for i in range(10)] 
def update_y(x): 
     y=[] 
     for i in x: 
      y.append(int(i)+2) 
     return y 

def update_table(x): 
     y=update_y(x) 
     data=dict(x=x,y=y) 
     source=ColumnDataSource(data) 
     columns=[TableColumn(field='x',title='x'),TableColumn(field='y',title='y')] 
     data_table=DataTable(source=source,columns=columns,width=500,height=500,editable=True) 
     curdoc().clear() 
     curdoc().add_root(row(data_table)) 
     source.on_change('data',update) 
def update(attr,old,new): 
     update_table(new['x']) 

ses=push_session(curdoc()) 
update_table(x) 
ses.show() 
ses.loop_until_closed()