Помимо проблем, упомянутых в комментарии к вашему вопросу Z4-уровня, есть и другие:
output_file
не будет работать с bokeh serve
- и bokeh serve
- это именно то, что вам нужно учесть, что вы хотите запустить Python код в ответ на действия пользователей в веб-интерфейсе. gridplot
принимает список кортежей, в котором указывается не только сам элемент, но и место для размещения каждого элемента. , Поскольку у вас есть только два виджета, column
должно быть достаточно
Рассмотрите этот рабочий код:
import io
from base64 import b64decode
import pandas as pd
from bokeh.io import curdoc
from bokeh.layouts import column
from bokeh.models import ColumnDataSource
from bokeh.models.widgets import FileInput, DataTable, TableColumn
column_map = dict(utmx='UTM X', utmy='UTM Y', elev='Elevasi',
lat='Latitude', lon='Longitude', ta='Tinggi Alat',
N='N', E='E', S='S', W='W', time='Time',
kt='Koreksi Tide', rdgrav='Bacaan')
source = ColumnDataSource(data={c: [] for c in column_map})
columns = [TableColumn(field="utmx", title="UTM X"), TableColumn(field="utmy", title="UTM Y"),
TableColumn(field="elev", title="Elevasi"), TableColumn(field="lat", title="Latitude"),
TableColumn(field="lon", title="Longitude"), TableColumn(field="ta", title="Tinggi Alat"),
TableColumn(field="N", title="North"), TableColumn(field="E", title="East"),
TableColumn(field="S", title="South"), TableColumn(field="W", title="West"),
TableColumn(field="time", title="Waktu Pengukuran"), TableColumn(field="kt", title="Koreksi tide"),
TableColumn(field="rdgrav", title="Bacaan Alat")]
data_table = DataTable(source=source, columns=columns, width=500, height=300)
def upload_fit_data(attr, old, new):
f = io.BytesIO(b64decode(new))
new_df = pd.read_excel(f, sheet_name='data')
source.data = {ds_c: new_df[df_c] for ds_c, df_c in column_map.items()}
file_input = FileInput(accept=".xlsx")
file_input.on_change('value', upload_fit_data)
curdoc().add_root(column(file_input, data_table))
Обратите внимание, что если вы не хотите иметь интерактивную веб-страницу и просто хотите иметь файл stati c HTML, тогда вы не можете использовать никакие обратные вызовы Python. Вам нужно будет указать файл XLSX через CLI и обрабатывать данные прямо при запуске скрипта.