超出范围定义的小部件

时间:2020-11-01 20:31:53

标签: python ipywidgets

我写了下面的代码,将一些小部件的创建链接到另一个小部件的值。麻烦是我现在无法访问在return_widgets中创建的小部件的值,因为它们超出了主程序的范围。如何访问这些小部件,或更具体地说,这些小部件的值?我试过让on_value_change函数返回小部件,但是鉴于调用该函数的唯一位置是在observe语句中,因此无法弄清楚如何将它们分配给任何东西。

import ipywidgets as widgets
from IPython.display import display

def return_widgets(size):
    return [widgets.IntText(value=x) for x in range(size)]

out = widgets.Output()
def on_value_change(change):
    out.clear_output()
    with out:
       w = return_widgets(change['new'])
       display(*w)

size = widgets.IntText(value=3, min=1, max=5, description='size')

size.observe(on_value_change, 'value')
widgets.VBox([size, out])

1 个答案:

答案 0 :(得分:1)

您是对的,这里的问题是范围,变量名称是在函数范围内创建的,然后在函数返回时丢失。

一种解决方案是在全局级别维护小部件字典,并在您更改所需小部件数量时将其写入该字典。

import ipywidgets as widgets
from IPython.display import display

widget_dict = {}

def return_widgets(size):
    return {str(x): widgets.IntText(description=str(x), value=x) for x in range(size)}

out = widgets.Output()
def on_value_change(change):
    out.clear_output()
    w = return_widgets(change['new'])
    for k,v in w.items():
        widget_dict[k] = v
    with out:
        display(*w.values())

size = widgets.IntText(value=3, min=1, max=5, description='size')

size.observe(on_value_change, 'value')
widgets.VBox([size, out])