2017-02-02 13 views
1

我想創建一個不使用JavaScript的自定義散景小部件,即不需要在Adding A Custom Widget上查看散景文檔。下面的例子演示了在PyQt4中創建一個自定義小部件(我使用了很多),以及我期望在散景中工作以及我得到的錯誤消息。在沒有JavaScript的情況下添加一個自定義的python散景小部件

有沒有其他方法可以在不使用JavaScript的情況下在散景中創建自定義小部件?具體而言,我試圖創建一個自定義滑塊,在每一側使用小鍵和+鍵來增加/減少滑塊1步。我想在許多應用程序中使用此自定義小部件,所以我希望將它定義爲自己的類,並將on_change方法鏈接到滑塊on_change方法。還有其他我想製作的自定義小部件(無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:具體的自定義的widget我試圖創建是每邊的按鈕滑塊(上標左「 - 」,右邊標有「+」),通過改變滑塊值1步。這用於微調Slider的值,因此不需要鼠標精確地達到目標值。我通過鏈接默認的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小部件)中生成繪圖和可視化應用程序的庫。它由兩個基本部分組成。 Bokeh的python一方實際上只是一個複雜的「包裝器」或「綁定」,最終生成一個聲明式JSON文檔,它反過來驅動一個JavaScript庫(BokehJS),它實際上完成了瀏覽器中的所有工作。

擴展散景必然意味着提供該方程的兩個方面:您必須提供一個(通常是非常小的)擴展的python聲明,這實際上只是指定了自動生成上述JSON格式所需的信息。而且你還必須爲擴展提供一個JavaScript(或Cof​​feeScript)實現,它實際上完成了瀏覽器中的所有工作。

由於瀏覽器無法運行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

謝謝你的迴應。我明白現在沒有辦法創建沒有JS的自定義散景小部件。你能不能請更新我的原始文章,並讓我知道你是否能夠在這裏提供任何指導。 _Transpiling_聽起來不像一個強大的方法。再次感謝! –

相關問題