我目前正在創建一個在服務器上運行的基于 Python- Bokeh的 webapp 應用程序。在此應用程序中,用戶可以預覽來自 pandas 數據框的數據(使用 BOKEH DATATABLE 顯示)并可以根據業務需要修改數據。刷新數據框后,用戶需要通過單擊 BOKEH BUTTON 小部件將數據框導出到他的本地系統(csv 格式) ?,F在我能夠創建 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
提交
取消