2017-05-27 4 views
4

Ich habe eine Bokeh-Anwendung, die die Python-Callbacks für verschiedene Widget-Ereignisse verwendet. Bei bestimmten Ereignissen möchte ich etwas JavaScript-Code ausführen, bevor ich die Python-Funktion aufrufen kann. Ist das möglich?Bokeh-Widgets rufen CustomJS- und Python-Callback für einzelnes Ereignis auf?

In diesem Fall ist der Python-Callback potenziell langwierig und ich möchte ein JavaScript-Spinner-Objekt vor und nach dem Ausführen des Python-Codes starten und stoppen.

Antwort

5

"busy"/"done" -Ereignisse (zum Aktivieren von Triggern oder anderen UI-Ereignissen) sind für eine der nächsten beiden Versionen geplant. (Ich hoffe, dass sie es in 0.12.6 machen, aber wenn nicht, werden sie in 0.12.7 sein.)

In der Zwischenzeit, die beste Wahl ist, etwas „Dummy“ Modell zu verwenden, um einen CustomJS Rückruf auszulösen. Zum Beispiel könnten Sie eine unsichtbare Glyphe hinzufügen und eine CustomJS beliebige Eigenschaft als Proxy für ein "busy" -Ereignis auslösen. Dies ist klobig, aber brauchbar.

Hier ist ein sehr grobes Umrissbeispiel. Die erste Warnung wird sofort angezeigt. Schließen Sie es, der nächste Alarm erscheint 5 Sekunden später.

import time 

from bokeh.io import curdoc 
from bokeh.layouts import column 
from bokeh.models import Button, CustomJS 
from bokeh.plotting import figure 

p = figure() 
p.circle([1,2,3,4,5], [2,6,3,1,6]) 

dummy = p.circle([1], [2], alpha=0) 
dummy.glyph.js_on_change('size', CustomJS(code=""" 
alert(cb_obj.size.value) 
""")) 

b = Button() 
def cb(): 
    dummy.glyph.size = 10 
    time.sleep(5) 
    dummy.glyph.size = 20 

b.on_click(cb) 

curdoc().add_root(column(b, p)) 
+0

Ich bin mir nicht sicher, wie man ein Ereignis (d. H. Knopfklick) sowohl mit meinem Python-Callback als auch mit einer Eigenschaftsänderung an der "Dummy" -Modellinstanz verbindet? Wenn der Python-Callback die Eigenschaft ändert, wird die Client-Seite diese Änderung erst sehen, wenn der Callback abgeschlossen ist (was gut wäre, um mein Spinner anzuhalten). Aber ich bin mir nicht sicher, wie das Startereignis gehandhabt werden soll. – tbc

+0

"Wenn der Python-Callback die Eigenschaft ändert, wird die Clientseite diese Änderung erst sehen, wenn der Rückruf abgeschlossen ist." Das stimmt nicht, siehe Beispielcode in der aktualisierten Antwort. – bigreddot

+0

Perfekt - ich werde das versuchen. Vielen Dank!!! – tbc

Verwandte Themen