我目前正在创建一个在服务器上运行的基于 Python- Bokeh的 webapp 应用程序。在此应用程序中,用户可以预览来自 pandas 数据框的数据(使用 BOKEH DATATABLE 显示)并可以根据业务需要修改数据。刷新数据框后,用户需要通过单击 BOKEH BUTTON 小部件将数据框导出到他的本地系统(csv 格式) 。现在我能够创建 webapp 应用程序,但是在将数据导出到本地系统时它会导致问题。当我单击按钮进行下载时,将下载一个 csv 文件,其中包含数据框中的初始默认数据。在那之后,即使我更新了数据框并再次单击“下载”按钮,也会下载相同的旧默认数据而不是更新的数据框。下面是我最后尝试的代码。请建议,需要对以下代码段进行哪些更改,以便每次刷新数据并单击下载按钮时,它都会导出数据表中显示的最新数据。from bokeh.io import curdocfrom bokeh.models import ColumnDataSource, CustomJSfrom bokeh.models.widgets import DataTable, NumberFormatter, TableColumn, Buttonfrom bokeh.layouts import column,rowimport pandas as pdimport numpy as np# Create Default datadata = {'COL_1_DEFAULT': np.random.randint(200, size=100), 'COL_2_DEFAULT': np.random.randint(200, size=100), 'COL_3_DEFAULT': np.random.randint(200, size=100), 'COL_4_DEFAULT': np.random.randint(200, size=100)}TABLE1_DATA = pd.DataFrame(data)source_new = ColumnDataSource(TABLE1_DATA)Columns_tab1 = [TableColumn(field=Ci, title=Ci) for Ci in TABLE1_DATA.columns] # bokeh columnsdata_table1 = DataTable(columns=Columns_tab1, source=source_new,height = 200) # Javascript for exporting datajs_code="""var data = source.data;var columns = Object.keys(source.data);var filetext = [columns.join(',')].shift().concat('\\n');var nrows = source.get_length();for (let i=0; i < nrows; i++) { let currRow = []; for (let j = 0; j < columns.length; j++) { var column = columns[j] currRow.push(source.data[column][i].toString()) } currRow = currRow.concat('\\n') var joined = currRow.join(); filetext = filetext.concat(joined); }var filename = 'data_output.csv';var blob = new Blob([filetext], { type: 'text/csv;charset=utf-8;' });//addresses IEif (navigator.msSaveBlob) {navigator.msSaveBlob(blob, filename);}
1 回答

慕沐林林
TA贡献2016条经验 获得超9个赞
这是一个错误。我刚刚创建了https://github.com/bokeh/bokeh/issues/10146
作为解决方法,更换
Exportbutton.js_on_click(CustomJS(args=dict(source=ColumnDataSource(df)),code = js_code ))
和
Exportbutton.js_event_callbacks['button_click'] = [CustomJS(args=dict(source=ColumnDataSource(df)), code=js_code)]
添加回答
举报
0/150
提交
取消