Итак, я пытаюсь создать Dashboard с библиотекой python Panel , поэтому у меня не было проблем с созданием взаимодействия между некоторыми виджетами и графиками, кроме Button Widget ,У меня есть две функции, которые я хочу выполнить, когда нажата соответствующая кнопка.
Первая - это функция для передачи данных в Dataframe, это что-то вроде этого:
import pandas as pd
from datetime import date
import panel as pn
import hvplot.pandas
pn.extension()
def update_df(event, save=True):
# Read data from csv file
df = pd.read_csv('../my_file.csv')
# Check if data is up to date
if df.index[-i] == pd.to_datetime(date.today()):
return df
else:
# This function updates the data from the last date to the current date
df = get_data(df)
if save:
df.to_csv('../my_file.csv')
return df
# Next is to create the button
update_button = pn.widgets.Button(name='Update DF')
# According to the docs, the on_click method should be enough to accomplish my purpose
update_button.on_click(update_df)
# When the button is clicked nothing happens...
pn.Row(update_button)
Я также попытался update_button.param.watch(update_df, 'clicks')
, но не получил другого результата.
Другая функция, которую я хочу вызвать при нажатии кнопки, является более сложной, поскольку включает в себя больше виджетов, это так:
# This function will be dependent of a list of variables and a integer value
# This values will be taken from two widgets
list_vars = pn.widgets.CrossSelector(value=['A'], options=['A', 'B', 'C', 'D', 'E', 'F', 'G'])
interval = pn.widgets.DiscreteSlider(value=120, options=[365, 240, 120, 60, 30])
# And of course, the button that will make the callback to the function
optimize_button = pn.widgets.Button(name='Optimize!', button_type='primary')
# Next, the function itself
@pn.depends(list_vars.param.value, interval.param.value)
def optimize_vars(list_vars, interval):
# The data is sliced by the variables of interest
temp = df[list_vars]
# A Monte Carlo simulation is made with the temp data, three arrays are returned,
# they have shape n x len(list_vars)
n = 50000
bsr, brr, mop = simulation(temp, interval, n)
# A markdown table in form of string is created, it contains mainly some statistics about
# the arrays returned by the simulation
m = markdown_table(bsr, brr, mop)
# A holoviews Scatterplot is created
plot = mcs_plot(bsr, brr, mop)
return m, plot
# The layout is created, I want it to show the control widgets as well as the markdown table and the
# plot returned by the function above defined, but again, when the button is clicked nothing happens!
pn.Row(pn.Column(pn.Row('# Variables', align='center'),
pn.Column(interval, align='center'),
pn.Column(list_vars, align='center'),
pn.Column(optimize_button, align='center'),
pn.Column(m, align='center')),
plot)
Итак, очевидный вопрос - что я пропускаю? ¿Как я могу добиться обратных вызовов с помощью виджетов кнопок?