Holoviz Panel:如何在回调方法中提取按钮名称?

Holoviz Panel: how to extract the button name in a callback method?

提问人:jvkloc 提问时间:11/10/2023 更新时间:11/10/2023 访问量:24

问:

我需要 Holoviz Panel 回调方法的按钮名称,因为该名称还用作包含单击时要执行的 sql 命令的字典的键。我试图搜索传递给回调的事件是否可能具有一些属性,包括名称,但我什么也没找到。必须有一种(?)方法来识别已单击的按钮。有人可以帮我解决这个问题吗?以下格式适用于 Jupyter Lab,但名称提取除外。

class Query:
    
    def __init__(self):
        self.buttons = [btn_0, btn_1, btn_2]
        self.data = dict

    def callback(self, event):
        
        value = self.dict[button_name]
        # Run an SQL query using the value
        return (the query result)

    def bind_buttons(self):
        
        for button in self.buttons:
            pn.bind(callback, self.button, watch=True)

query = Query()
query.bind_buttons()
query_buttons = pn.Column(
    '# Queries', 
    query.buttons[0],
    query.buttons[1],
    query.buttons[2],
)
python 按钮 回调 holoviz-panel

评论


答:

0赞 jvkloc 11/10/2023 #1

这个问题可以通过使用 而不是 来规避。-method 允许从 中提取名称。以下模式有效。on_clickbindon_clickevent.obj.name

class Query:
    
    def __init__(self):
        self.buttons = [btn_0, btn_1, btn_2]
        self.data = dict

    def callback(self, event):
        
        value = self.dict[event.obj.name]
        # Run an SQL query using the value
        return (the query result)

    def bind_buttons(self):
        
        for button in self.buttons:
            button.on_click(callback)

query = Query()
query.bind_buttons()
query_buttons = pn.Column(
    '# Queries', 
    query.buttons[0],
    query.buttons[1],
    query.buttons[2],
)
1赞 Yuri R 11/10/2023 #2

在 Panel 中,当您将回调绑定到按钮时,绑定到该按钮的函数默认不会接收任何参数。但是,您可以使用函数将其他参数传递给回调。functools.partial

import panel as pn
from functools import partial

class Query:
    
    def __init__(self):
        self.buttons = [pn.widgets.Button(name='btn_0'), 
                        pn.widgets.Button(name='btn_1'), 
                        pn.widgets.Button(name='btn_2')]
        self.data = {'btn_0': 'query_0', 'btn_1': 'query_1', 'btn_2': 'query_2'}

    def callback(self, event, button_name):
        value = self.data[button_name]
        print(f'Button {button_name} was clicked! Running query: {value}')
        # Run an SQL query using the value
        # return (the query result)

    def bind_buttons(self):
        for button in self.buttons:
            button.on_click(partial(self.callback, button_name=button.name))

query = Query()
query.bind_buttons()

query_buttons = pn.Column(
    '# Queries', 
    *query.buttons,
)

query_buttons.servable()

评论

0赞 jvkloc 11/10/2023
确实,谢谢。另一个感谢您指出开箱清单。*