2017-08-04 1 views
1

J'essaie actuellement ipywidgets dans Jupyter. Je voulais transmettre la valeur ou la description que le bouton a à textArea et ajouter n'importe quelle valeur de bouton qu'il indique.Python Ipywidgets: Passing Button (valeur/description) sur un clic sur un widget textarea

Jusqu'à présent, c'est le code que j'ai:

#testing adding button and textbox 
from ipywidgets import widgets as wd 
from ipywidgets import Layout, Box 
from IPython.display import display 

btnLayout = Layout(flex='1 1 auto', width='auto') 

btns= [ 
    wd.Button(description="Add Route"), 
    wd.Button(description="234"), 
    wd.Button(description="411") 
] 

box_layout = Layout(display='flex', 
        flex_flow='row', 
        align_items='stretch') 

box = Box(children=btns, layout=box_layout) 

display(box) 
box.children[1].layout.visibility = 'hidden' 
box.children[2].layout.visibility = 'hidden' 

txtArea = wd.Textarea() 
display(txtArea) 

def show(b): 
    box.children[1].layout.visibility = 'visible' 
    box.children[2].layout.visibility = 'visible' 

#function intended to append button value/description to textArea 
def add_text(b): 
    txtArea.value = "test, " + txtArea.value 

box.children[0].on_click(show) 
box.children[1].on_click(add_text) 
box.children[2].on_click(add_text) 

Je lis sur les liens et observer ... mais je ne pense pas que cela va faire ce que je l'intention d'avoir dans mon code. Des idées comment contourner cela s'il n'y a pas de manière directe, contrairement aux intsliders etc.?

+0

Avez-vous eu la chance d'essayer ma réponse? –

+0

@JamesDraper salut! Je vais l'essayer maintenant. Je reviens juste d'où je suis parti après les weekends – Reiion

Répondre

0

suffit de préciser la classe ipywidgetsButton n'a pas un attribut value mais vous pouvez en ajouter un par sous-classer (see this gist for an example of that).

Si j'ai bien compris la question, je pense que cela fonctionnera pour vous;

#testing adding button and textbox 
from ipywidgets import widgets as wd 
from ipywidgets import Layout, Box 
from IPython.display import display 

btnLayout = Layout(flex='1 1 auto', width='auto') 

btns= [ 
    wd.Button(description="Add Route"), 
    wd.Button(description="234"), 
    wd.Button(description="411") 
] 

box_layout = Layout(display='flex', 
        flex_flow='row', 
        align_items='stretch') 

box = Box(children=btns, layout=box_layout) 

display(box) 
box.children[1].layout.visibility = 'hidden' 
box.children[2].layout.visibility = 'hidden' 

txtArea = wd.Textarea() 
display(txtArea) 

def show(b): 
    box.children[1].layout.visibility = 'visible' 
    box.children[2].layout.visibility = 'visible' 

#function intended to append button value/description to textArea 
def add_text(b): 
    txtArea.value = b.description + txtArea.value 

box.children[0].on_click(show) 
box.children[1].on_click(add_text) 
box.children[2].on_click(add_text) 

Veuillez commenter ci-dessous si cela ne fonctionne pas pour vous.

+0

Oui ça a marché! juste dû basculer entre qui vient en premier dans l'append. Merci aussi pour l'astuce de sous-classement. Je pensais que le b dans la fonction est juste booléen. Puis-je savoir quelle est la différence entre 'box.children [1] .on_click (add_text,) # <--- CE box.children [2] .on_click (add_text)' # <--- et CE – Reiion

+0

C'était un typo le chat doit avoir traversé le clavier quand j'étais hors de la pièce lol. –

+0

haha ​​lol okay au moins c'est clarifié :)) merci encore! – Reiion