2017-02-02 9 views
1

Я хочу создать пользовательский виджет bokeh без использования JavaScript, то есть без последующей документации bokeh по адресу Adding A Custom Widget. В приведенном ниже примере демонстрируется создание пользовательского виджета в PyQt4 (я использую это много) и что я ожидаю работать в боке вместе с сообщением об ошибке, которое я получаю.добавить пользовательский виджет python bokeh без JavaScript

Есть ли другой способ создания пользовательского виджета в боке без использования JavaScript? В частности, я пытаюсь создать пользовательский слайдер с кнопками «маленький» и «+» с каждой стороны, которые увеличивают/уменьшают ползунок на 1 шаг. Я хочу использовать этот пользовательский виджет во многих приложениях, поэтому хочу, чтобы он был определен как собственный класс с методом on_change, связанным с методом слайдера on_change. Есть другие пользовательские виджеты в bokeh, которые я хочу сделать (без JS!), И я хотел бы знать, возможно ли это.

# this works as a base to develop custom PyQt4 widgets 
from PyQt4 import QtGui 
import sys 

class NewWidget(QtGui.QWidget): 
    def __init__(self): 
     super().__init__() 

app = QtGui.QApplication([]) 
widget = NewWidget() 
widget.show() 
sys.exit(app.exec_()) 


# this does not work as a base to develop custom bokeh widgets 
# when run, a tab opens with the message 
# Bokeh Error 
# Model `NewWidget' does not exist. This could be due to a widget 
# or a custom model not being registered before first usage. 
from bokeh.plotting import show 
from bokeh.layouts import widgetbox 
from bokeh.models.widgets import Widget 

class NewWidget(Widget): 
    def __init__(self): 
     super().__init__() 

new = NewWidget() 
show(widgetbox(new)) 

UPDATE: Конкретный пользовательский виджет Я пытаюсь создать слайдер с кнопкой на каждой стороне (слева с надписью «-», справа с меткой «+»), которые изменяют значение Slider с помощью 1 шаг. Это используется для точной настройки значения ползунка, так что мышь не требуется точно достигать целевого значения. Я создал этот настраиваемый виджет, связав объекты по умолчанию Slider и Button, и он отображается в браузере, но функция обратного вызова не работает (в частности, метод Slider 'on_change').

Slider With Buttons

Это пользовательский виджет просто реализовать с боком и JS? Есть ли онлайн-ссылка, которая может давать подсказки без глубокого погружения в JS.

+0

'.on_change' требует сервера Боке (это где питон обратного вызова запускается на выполнение) Вы говоря, что это не работает с серверным приложением? Или это не в контексте серверного приложения? В любом случае, похоже, что это должно быть выполнено более всего с помощью строки или двух из JS и обратного вызова .js_on_change': http://bokeh.pydata.org/en/latest/docs/user_guide/interaction/callbacks.html # customjs-for-generic-events, для которого не требуется сервер – bigreddot

+0

Для кнопок, в частности, вы все равно хотите использовать свойство callback для установки обратного вызова 'CustomJS'. См. Ниже – bigreddot

ответ

3

Bokeh - это библиотека для создания графических и визуальных приложений в современных браузерах (или встроенных HTML-виджетах). Он состоит из двух основных частей. На стороне python Bokeh на самом деле просто сложная «обертка» или «привязка», которая в конечном итоге создает декларативный JSON-документ, который, в свою очередь, управляет библиотекой JavaScript (BokehJS), которая фактически выполняет всю работу в браузере.

Расширение Bokeh обязательно означает предоставление обеих сторон этого уравнения: вы должны предоставить (обычно очень минимальное) декларацию python для расширения, что на самом деле просто указывает информацию, необходимую для автоматического создания формата JSON, описанного выше. И вы также должны предоставить реализацию JavaScript (или CoffeeScript) для расширения, которая фактически выполняет всю работу в браузере.

Поскольку браузеры не имеют возможности запускать код Python, реализация обязательно должна быть JavaScript.

Есть несколько библиотек, таких как Flexx и Brython, которые могут «переводить» python в JavaScript. Вы можете найти их полезными как средство избежать написания JavaScript напрямую, но эти библиотеки часто имеют причуды и конкретные недостатки в некоторых случаях использования, поэтому YMMV.


Вот полный пример, который использует CustomJS обратного вызова на кнопку, чтобы обновить бегунок:

from bokeh.models import Button, CustomJS, Slider 
from bokeh.layouts import row 
from bokeh.io import output_file, show 

slider = Slider(start=0, end=10, value=0, step=0.1) 

button = Button() 
button.callback = CustomJS(args=dict(slider=slider), code=""" 
    slider.value += 0.1 
""") 

output_file("foo.html") 

show(row(slider, button)) 
+0

Благодарим за отзыв. Теперь я понимаю, что нет никакого способа создать собственный виджет bokeh без JS. Не могли бы вы прочитать UPDATE на мой оригинальный пост и сообщить мне, можете ли вы предложить какие-либо рекомендации здесь. _Transpiling_ не похож на надежный подход. Еще раз спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^