我有一個名爲getcoords.py的散景服務器應用程序。我啓動服務器:bokeh serve getcoords.py
。我有HoverTool
和CustomJS
回調函數。除此之外,我有一個quad
glyph
與on_change
配置爲觸發在服務器端的selected
事件。每次點擊quad
glyph
時,都會執行onTab
函數。當我點擊字形時,我想以某種方式與客戶端進行通信並獲取指針座標。這裏是代碼:在散景服務器配置中如何從客戶端瀏覽器獲取x,y座標到服務器
import bokeh
import bokeh.plotting
p = bokeh.plotting.figure(plot_height=200,x_range=(0,10),y_range=(0,10))
imquad = p.quad(top=[8], bottom=[2], left=[2], right=[8])
sourceXY = bokeh.models.ColumnDataSource(data=dict(x = [0], y = [0]))
callback_hover = bokeh.models.CustomJS(args=dict(sourceXY=sourceXY), code="""
console.log('Coords:'+sourceXY.data['x'] +','+sourceXY.data['y'])
sourceXY.data['x'] = [cb_data['geometry'].x];
sourceXY.data['y'] = [cb_data['geometry'].y];
sourceXY.trigger('change');
""")
def onHover(attr, old, new):
print "Hover"
counter = 0
def onTab(attr, old, new):
global counter
print "Tap on quad. Coordinates:",sourceXY.data['x'], sourceXY.data['y']
sourceXY.data['x'], sourceXY.data['y'] = [counter],[counter]
counter += 1
sourceXY.trigger('data',None,None)
# unselecting imquad to keep triggering on_change:
new['1d']['indices'] = []
imquad.data_source.on_change('selected',onTab)
hover_tool = bokeh.models.HoverTool(callback=callback_hover)
tap_tool = bokeh.models.TapTool()
p.add_tools(tap_tool)
p.add_tools(hover_tool)
bokeh.io.curdoc().add_root(p)
這裏是一個瀏覽器的屏幕截圖顯示JavaScript
控制檯日誌。 Coords:0,0 1,1 2,2 3,3 4,4對應於一次點擊四叉字符的時刻,並且這些值從服務器發送到客戶端瀏覽器。 javascript CustomJS
代碼首先顯示sourceXY的值,然後用x和y數據座標替換它。當你移動鼠標時,sourceXY正在用這些座標進行更新,只要你不點擊,這些就是在JS控制檯中顯示的。
這裏是在服務器端控制檯的屏幕拍攝。每次四字形點擊時,都會執行onTab(attr,old,new)例程。首先顯示存儲在sourceXY中的值,然後分配一個全局計數器值,每次執行該例程時將增加1。這裏是我希望能夠從客戶端讀取sourceXY的價值,但我一直無法做到。
wirelessprv-XX-XXX-XXX-XXX:GetCoords pablo$ bokeh serve getcoords.py
2017-02-25 21:26:00,899 Starting Bokeh server version 0.12.4
2017-02-25 21:26:00,911 Starting Bokeh server on port 5006 with applications at paths ['/getcoords']
2017-02-25 21:26:00,912 Starting Bokeh server with process id: 36965
2017-02-25 21:26:01,267 200 GET /getcoords (::1) 85.38ms
2017-02-25 21:26:01,785 WebSocket connection opened
2017-02-25 21:26:01,788 ServerConnection created
Tap on quad. Coordinates: [0] [0]
Tap on quad. Coordinates: [0] [0]
Tap on quad. Coordinates: [1] [1]
Tap on quad. Coordinates: [2] [2]
Tap on quad. Coordinates: [3] [3]
我曾嘗試是創建一個在CustomJS
客戶端更新一個名爲ColumnDataSource
sourceXY。然後,當我點擊標誌符時,服務器端的python代碼將讀取尚未更新的服務器端ColumnDataSource
的值,然後修改它以測試服務器到客戶端的通信。這部分工作很好,因爲客戶端能夠讀取從服務器發送的x和y。 我想知道是否有辦法從客戶端到服務器端獲取保存在ColumnDataSource
(或點擊發生時的座標本身)中的座標。 任何建議,意見,歡迎。謝謝。