2017-07-19 73 views
1

如何获得执行功能的输出on_click通过ipywidgets.Button 外部函数在下一步中使用?例如,我想要在jupyter笔记本的下一个单元中使用每次点击后获取a的值。到目前为止,我只得到None执行功能的返回输出'on_click'

from ipywidgets import Button 
def add_num(ex): 
    a = b+1 
    print('a = ', a) 
    return a 

b = 1 
buttons = Button(description="Load/reload file list") 
a = buttons.on_click(add_num) 
display(buttons) 
print(a) 
+0

对于像我这样挣扎的人来说,声明'global a'解决了这个问题。不是最优雅的解决方案。但这就是我通过它的方式。 – Ashish

+0

而声明一个全局可能适用于这种类型的问题我建议不要这样做一个可变变量签出[这个问题]的答案(https://stackoverflow.com/questions/19158339/why-are-global-变量 - 邪恶)更多关于为什么不使用全局变量。 –

+0

我知道使用全局的弊端,完全同意你的看法。 – Ashish

回答

1

,我发现这样做这类事情的最好方法是通过创建widgets.Button一个子类,然后添加一个新的traitlet属性。这样,您可以在创建新按钮对象时加载想要对其执行操作的值。只要你想外设功能的你可以访问此新traitlet属性。这是一个例子;

from ipywidgets import widgets 
from IPython.display import display 
from traitlets import traitlets 

class LoadedButton(widgets.Button): 
    """A button that can holds a value as a attribute.""" 

    def __init__(self, value=None, *args, **kwargs): 
     super(LoadedButton, self).__init__(*args, **kwargs) 
     # Create the value attribute. 
     self.add_traits(value=traitlets.Any(value)) 

def add_num(ex): 
    ex.value = ex.value+1 
    print(ex.value) 

lb = LoadedButton(description="Loaded", value=1) 
lb.on_click(add_num) 
display(lb) 

loaded button example screenshot 希望有所帮助。如果这不能解决您的问题,请在下面评论。

+1

谢谢!它确实解决了这个问题。这实际上只是一个示例问题,真正的问题是装载'on_click'的小部件(复选框)字典。但是,我可以通过'values'传递完整的字典,所以它完美地工作。 – Ashish