首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新下拉小部件(ipywidget)

更新下拉小部件(ipywidget)
EN

Stack Overflow用户
提问于 2018-05-13 20:50:19
回答 1查看 1.6K关注 0票数 4

我正在使用交互式ipywidget下拉列表来过滤一定数量的数据,并以圆滑的方式绘制图形。

我的问题在于下拉小部件的更新:下面是一个简化的示例:

代码语言:javascript
复制
    import ipywidgets as widgets
from ipywidgets import *
from IPython.display import display, clear_output, HTML

def update_drop2(*args):
    if Drop1.value=='R':
        Drop2.options = {'un':'1','trois':'3','quatre':'4'}
    if Drop1.value=='B':
        Drop2.options = {'un':'1','trois':'3','quatre':'4'}
    if Drop1.value=='G':
        Drop2.options = {'deux':'2','quatre':'4','trois':'3'}

def action(*args):
    print('action')


Drop1 = widgets.Dropdown(
        options = {'red':'R','blue':'B','green':'G'},
        value = 'R',
        description='Drop1 :',
        disabled=False,
        continuous_update=False,
        style = {'description_width': 'initial'}
        )

Drop2 = widgets.Dropdown(
        options = {'un':'1','deux':'2','trois':'3'},
        value = '3',
        description='Drop2 :',
        disabled=False,
        continuous_update=False,
        style = {'description_width': 'initial'}
        )

display(Drop1,Drop2)

Drop1.observe(update_drop2,'value')
Drop2.observe(action,'value')

drop1更改drop2的选项。drop1的任何更改(以及drop2应该启动一个操作(这里只是一个例子的打印)

  • 当drop2的选项列表不同并由drop1更改时,将自动在新列表的第一个值处设置反2值,即使所选择的值已经存在于前一个列表中。如果这个值在新列表中仍然可用,是否有保留该值的选项?(例如:选择drop1 = R,drop2 = 'trois‘,然后执行drop2 1=’G‘:drop2是在’2‘处自动设置的。选择drop1 = R,drop2 =3,然后做do 1=‘B’:drop2保持在‘3’)
  • 如果我试图在更新drop2 2选项之后强制使用Dro2.value,这将使=2个操作发生2次更改.我想不出一种避免it..so的方法,有时我重复这个动作,有时我没有动作……

谢谢你的帮忙

EN

回答 1

Stack Overflow用户

发布于 2021-07-27 20:08:04

下面的代码应该可以解决这两个问题:

代码语言:javascript
复制
import ipywidgets as widgets
from ipywidgets import *
from IPython.display import display, clear_output, HTML

out = widgets.Output()

def action(*args):
    with out:
        print('action')
        

def update_drop2(*args):
        temp = Drop2.value
        Drop2.unobserve(action, 'value')
        
        if Drop1.value=='R':
            Drop2.options = {'un':'1','trois':'3','quatre':'4'}
        if Drop1.value=='B':
            Drop2.options = {'un':'1','trois':'3','quatre':'4'}
        if Drop1.value=='G':
            Drop2.options = {'deux':'2','quatre':'4','trois':'3'}
        
        if str(temp) in Drop2.options.values():
            Drop2.value = temp
        
        Drop2.observe(action, 'value')
        action()

Drop1 = widgets.Dropdown(
        options = {'red':'R','blue':'B','green':'G'},
        value = 'R',
        description='Drop1 :',
        disabled=False,
        continuous_update=False,
        style = {'description_width': 'initial'}
        )

Drop2 = widgets.Dropdown(
        options = {'un':'1','deux':'2','trois':'3'},
        value = '3',
        description='Drop2 :',
        disabled=False,
        continuous_update=False,
        style = {'description_width': 'initial'}
        )

display(Drop1, Drop2, out)

Drop1.observe(update_drop2,'value')
Drop2.observe(action, 'value')
  1. 我添加了Output小部件来实际显示输出。
  2. 要修复第一个要点,可以使用一个临时变量temp来检查Drop2的值是否包含在Drop2.options字典中,并在需要时相应地更改该值。Drop2.value中的更改发生了,因为字典是从python3.7开始排序的。
  3. 要修复第二个要点,即在更改Drop1.value时不要进行双重调用,这也可能会更改Drop2.valueDrop2.options,您可以在函数update_drop2中取消对Drop2的观察,并在最后再次观察它。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50320535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档