超出范围定义的小部件
widgets defined out of scope
我写了下面的代码来link创建一些小部件到另一个小部件的值。问题是我现在无法访问在 return_widgets
中创建的小部件的值,因为它们超出了主程序的范围。我如何访问这些小部件,或者更具体地说,如何访问这些小部件的值?我试过使用 on_value_change
函数 return 小部件,但无法弄清楚如何将它们分配给任何东西,因为调用该函数的唯一位置是在 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])
你是对的,范围是这里的问题,变量名是在函数范围内创建的,然后在函数 returns.
时丢失
一个解决方案是在全局级别维护一个小部件字典,并在您更改所需小部件的数量时写入此字典。
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])
我写了下面的代码来link创建一些小部件到另一个小部件的值。问题是我现在无法访问在 return_widgets
中创建的小部件的值,因为它们超出了主程序的范围。我如何访问这些小部件,或者更具体地说,如何访问这些小部件的值?我试过使用 on_value_change
函数 return 小部件,但无法弄清楚如何将它们分配给任何东西,因为调用该函数的唯一位置是在 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])
你是对的,范围是这里的问题,变量名是在函数范围内创建的,然后在函数 returns.
时丢失一个解决方案是在全局级别维护一个小部件字典,并在您更改所需小部件的数量时写入此字典。
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])