2017-07-19 2 views
1

Comment obtenir la sortie de la fonction exécutée on_click par ipywidgets.Button en dehors de la fonction à utiliser dans les étapes suivantes? Par exemple, je souhaite récupérer la valeur de a après chaque clic à utiliser dans la cellule suivante du carnet jupyter. Jusqu'à présent, je n'ai que None.Renvoie la sortie de la fonction exécutée '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

Pour quelqu'un qui se bat comme moi, déclarer «global a» résout le problème. Pas la solution la plus élégante. mais c'est comme ça que je l'ai traversé. – Ashish

+0

tout en déclarant un global peut fonctionner pour ce type de problème, je vous déconseille de le faire pour une variable modifiable checkout les réponses à [cette question] (https://stackoverflow.com/questions/19158339/why-are-global- variables-evil) pour en savoir plus sur pourquoi ne pas utiliser les globals. –

+0

Je connais les inconvénients de l'utilisation globale, d'accord avec vous complètement. – Ashish

Répondre

1

La meilleure façon que je l'ai trouvé à faire ce genre de chose est en créant une sous-classe de widgets.Button puis ajouter un nouvel attribut traitlet. De cette façon, vous pouvez charger la (les) valeur (s) sur laquelle vous voulez effectuer des opérations lorsque vous créez un nouvel objet bouton. Vous pouvez accéder à ce nouvel attribut traitlet chaque fois que vous voulez à l'intérieur ou en dehors de de la fonction. Voici un exemple;

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 espoir qui aide. Veuillez commenter ci-dessous si cela ne résout pas votre problème.

+1

Merci! Cela a résolu le problème. Ceci est en fait seulement un exemple de problème, le vrai problème a un dictionnaire de widgets (cases à cocher) qui ont été chargés 'on_click'. Mais, je pourrais passer le dictionnaire complet à travers les «valeurs», de sorte que tout a parfaitement fonctionné. – Ashish