【问题标题】:Interactive function with SelectMultiple widgets arranged in a HBox在 HBox 中排列的 SelectMultiple 小部件的交互功能
【发布时间】:2019-12-15 09:27:11
【问题描述】:

我想用 Jupyter 笔记本构建一个交互式应用,但我对小部件还没有太多经验。

在我的代码中,我定义了 2 个 SelectMultiple 小部件(参见下面代码中的定义)。

我使用例如“HBox”(参见代码)将 2 个小部件组合在特定布局中。

我还定义了一个函数,它基于这两个小部件的值在数据库中搜索并返回一个整数,该整数等于数据库中选定元素的数量(参见下面的代码)。

我想打印函数“No_selected”的输出,以便当我在 HBox 布局中显示的 2 个 SelectMultiple 小部件之一中选择不同的输入时,它会以交互方式更改。

我已尝试阅读小部件的文档 (https://ipywidgets.readthedocs.io/en/stable/user_guide.html)。

我曾尝试在函数之前使用 Interact 装饰器“@Interact”,但当我这样做时,Jupyter 会为 W1 和 W2 显示两个额外的小部件,而不是允许我通过使用 HBox 中的两个小部件来运行该函数。

W1 小部件定义示例(W2 类似):

W1 = widgets.SelectMultiple(
    options=['Apples', 'Oranges', 'Pears'],
    value=['Oranges'],
    #rows=10,
    description='Fruits',
    disabled=False
)

布局示例:

Wboth = widgets.HBox([W1, W2])

函数定义示例:

def SELECTION(W1=('Apples'), W2=('Apples')):
    ...
    ...
    ...
    return No_selected

你能建议我怎么做吗?

【问题讨论】:

    标签: python-3.x jupyter interactive ipywidgets


    【解决方案1】:

    我认为您需要比标准 interact 更多的东西,因为您需要从不仅仅是您正在更改的小部件中获取信息。

    我已经把你想要的行为的class 版本放在一起,我发现自己使用observeinteract 多得多,现在我更熟悉组合和子类化。您可以更改您的 _observed_function 以使用当前的小部件选择来执行您需要的操作。

    import ipywidgets as widgets
    
    class SelectMultipleInteract(widgets.HBox):
    
        def __init__(self):
            self.W1 = widgets.SelectMultiple(
                options=['Apples', 'Oranges', 'Pears'],
                value=['Oranges'],
                #rows=10,
                description='Fruits',
                disabled=False
            )
    
            self.W2 = widgets.SelectMultiple(
                options=['Carrots', 'Potatoes', 'Tomatoes'],
                value=['Carrots'],
                #rows=10,
                description='Veg',
                disabled=False
            )
    
            self.selectors = [self.W1, self.W2]
            super().__init__(children=self.selectors)
            self._set_observes()
    
        def _set_observes(self):
            for widg in self.selectors:
                widg.observe(self._observed_function, names='value')
    
        def _observed_function(self, widg):
            for widg in self.selectors:
                print(widg.description)
                print(widg.get_interact_value())
    
    SelectMultipleInteract()
    

    【讨论】:

    • 谢谢您,我已经尝试按照您的建议进行操作,并且有效。此外,我更了解如何使用“观察”。
    • 以下工作: Whbox = widgets.HBox([W1, W2, W3]) def Update(W1,W2,W3): Wno_selected = Jselect(W1.value, W2.value, W3 .value) display(Whbox) W1.observe(Update, 'value') W2.observe(Update, 'value') W3.observe(Update, 'value') display(Wno_selected)
    • 如果我需要使用这种方法根据另一个小部件的选择更新一个小部件的选项,路径是什么?
    • 您可以在W1观察到的函数中设置W2.options。请注意不要进入 W1 改变 W2 的反馈循环,从而改变 W1 等等。
    猜你喜欢
    • 2019-03-29
    • 2020-03-20
    • 2010-10-13
    • 2011-02-07
    • 2020-06-10
    • 2011-03-28
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多