2017-08-11 99 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()