如何使用Jupyter小部件创建依赖下拉列表以从dict获取数据?

时间:2019-04-10 02:32:22

标签: python python-3.x jupyter-notebook ipywidgets

我正在尝试使用Jupyter Dropdowns为两个变量赋值,其中第一个下拉列表是数据中心,第二个下拉列表是该数据中心内的可用站点,以便我可以在代码中进一步使用这些变量。

我尝试了来自不同文章的多个示例,但找不到我所缺少的内容。

我有以下内容:

data_center_environments = {
    'US': {
        'data_center': 'us..com',
        'api_keys': {
            'sandbox' : '3_EV',
            'dev_parent' : '3_hK',
            'stage' :'3_GE',
            'prod' : '3_NL',
        }
    },
    'RU': {
        'data_center': 'ru..com',
        'api_keys': {
            'stage_parent' : '3_sN',
            'prod_parent' : '3_R9',
        }
    },
    'CN': {
        'data_center': 'cn..cn',
        'api_keys': {
            'stage_parent' : '3_3k',
            'prod_parent' : '3_MH',
        }
    },
    'EU': {
        'data_center': 'eu..com',
        'api_keys': {
            'sandbox' : '3_7h',
        }
    },
}

我创建了两个函数来获取数据中心和站点:

def get_dc(dc_select=None):
    dc = data_center_environments.get(dc_select)['data_center']
    return dc

def get_site_api_key(dc_select=None, site_select=None):
    site_api_key = data_center_environments[dc_select]['api_keys'][site_select]
    return site_api_key

在这里我描述两个下拉菜单:

dc_s = widgets.Dropdown(
    options = data_center_environments.keys(),
    description = 'Data Center:',
    disabled = False,
)

site_s = widgets.Dropdown(
    options=list(data_center_environments[dc_s.value]['api_keys']),
    description = 'API Key:',
    disabled = False,
)


def on_value_change(change):
    dc = change.new
    site_s.options = data_center_environments[dc_s.value]['api_keys']

dc_s.observe(on_value_change, 'value')

这是我在Jupyter Notebook页面上调用它们的方式:

domain = interactive(get_dc, dc_select = dc_s)
site = interactive(get_site_api_key, dc_select = dc_s, site_select = site_s)
display(domain)
display(site)

问题: 0。我有3个下拉菜单,而不是2个 1.更改数据中心值时出现异常 2.当我尝试打印“ domain”,“ domain.value”时,我得到“ None”作为输出

我要实现的目标: 在: 域= 网站= 打印(域,站点)

出: 选择数据中心[下拉:'US','CN','RU'等]->选择'US' 选择站点[下拉“美国”:“产品”,“阶段”,“ dev_parent”,“沙盒”]->选择“产品”

'us..com','3_NL'

我在做什么错?如何更改我的代码以使其工作? 谢谢!

1 个答案:

答案 0 :(得分:0)

我最终写了一个返回字典的函数,而我只是从中获取值。 下面的代码是《微件指南》中的教科书示例。

解决方案:

dc = 'US'
domain = widgets.Dropdown(
    options = list(data_center_environments),
    description = 'Data Center:',
    disabled = False,
)

site = widgets.Dropdown(
    options=list(data_center_environments[dc]['api_keys']),
    description = 'API Key:',
    disabled = False,
)

def on_value_change(change):
    dc = change.new
    site.options = data_center_environments[dc]['api_keys']

domain.observe(on_value_change, 'value')

def creds(data_center, api_key, use_secret):
    data_center = data_center_environments[domain.value]['data_center']
    api_key = site.value
    creds = dict()
    creds['data_center'] = data_center
    creds['api_key'] = api_key
    return creds