С pyviz / panel, как я могу изменять значения в панелях только при нажатии кнопки? - PullRequest
1 голос
/ 29 октября 2019

Я бы хотел создать панель управления с pyviz/panel, чтобы она не обновлялась в реальном времени, как только значения виджетов будут изменены. Вместо этого я бы хотел, чтобы он дождался нажатия кнопки и только затем соответствующим образом изменил значения на приборной панели.

Ниже приведен минимальный рабочий пример. Здесь я хотел бы генерировать случайные числа каждый раз, когда нажимается кнопка, но, похоже, она ничего не делает.

В моей реальной задаче я бы нажал на базу данных, чтобы получить несколько строкданных на основе входных виджетов. Я полагаю, что это может работать так же?

import numpy as np
import pandas as pd

import param

import panel as pn
pn.extension()

class UserDash(param.Parameterized):
    mean = pn.widgets.IntSlider(value=10, start=0, end=100)
    output_pane = pn.widgets.TextInput(value='Ready')
    button = pn.widgets.Button(name='Generate', button_type='primary')
    button.on_click(output_pane)

    @param.depends('button')
    def output_pane(self):
        print(self.mean.value)
        df = pd.DataFrame({'x': np.random.normal(int(self.mean.value), 1, 5)}, index=range(5))
        return df

    def panel(self):
        return pn.Column(self.mean, self.button, self.output_pane)

dash = UserDash()
dash.panel().servable()

Я использую панель 0.6.0, работающую на Jupyter 6.0.0. Спасибо!

1 Ответ

1 голос
/ 29 октября 2019

Поскольку вы создаете параметризованный класс, вы не можете использовать pn.widgets () .
Ваши переменные и кнопки для выбора и генерации значений также должны быть параметрами.
Я скорректировал ваш пример с помощью , изменив переменную 'mean' на param.Integer () и 'button' на param.Action () .

Подробнееоб использовании параметров можно найти здесь: https://panel.pyviz.org/user_guide/Param.html

# import libraries
import numpy as np
import pandas as pd
import param
import panel as pn
pn.extension()

# instead of pn.widgets I'm using param.Integer() and param.Action() to create your variables
class UserDash(param.Parameterized):
    mean = param.Integer(default=10, bounds=(0, 100))
    button = param.Action(lambda x: x.param.trigger('button'), label='Generate')

    @param.depends('button')
    def output_pane(self):
        return pd.DataFrame({'x': np.random.normal(int(self.mean), 1, 5)}, index=range(5))

    def panel(self):
        return pn.Column(
            self.param['mean'], 
            self.param['button'], 
            self.output_pane
        )

# create instance of dashboard
dash = UserDash()
dash.panel().servable()

Здесь также полезен следующий вопрос / ответ по использованию кнопок:
https://stackoverflow.com/questions/57970603/use-button-to-trigger-action-in-panel-with-parameterized-class-and-when-button-a

...