使用 pyviz/panel,如何仅在单击按钮时修改窗格中的值?
With pyviz/panel, how do I modify values in panes only when a button is clicked?
我想用 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()
我在 Jupyter 6.0.0 上使用面板 0.6.0,运行。谢谢!
由于您正在创建参数化 Class,因此您不能使用 pn.widgets()。
select 和生成值的变量和按钮也需要是参数。
我通过 将变量 '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()
下面question/answer关于按钮的使用我觉得对这里也有帮助:
我想用 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()
我在 Jupyter 6.0.0 上使用面板 0.6.0,运行。谢谢!
由于您正在创建参数化 Class,因此您不能使用 pn.widgets()。
select 和生成值的变量和按钮也需要是参数。
我通过 将变量 '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()
下面question/answer关于按钮的使用我觉得对这里也有帮助: