2013-03-15 27 views
1

我想用encol使用chaco工具ScatterInspector和/或ScatterInspectorOverlay。我已經設置了一個非常簡單的控制器和視圖(源代碼如下),但無法確定如何繼續。我嘗試過不成功地遵循我發現的最小和舊的例子。如何使用ScatterInspector和ScatterInspectorOverlay?

如果我取消了ScatterInspectorOverlay重疊部分,該代碼不能與

文件「... /查科/ scatter_inspector_overlay.py」 51行運行,在覆蓋如果不打印或不情節。指數或不getattr的(劇情,「價值」,真):

如果我註釋掉覆蓋部分,我當然沒有得到覆蓋的行爲我想也是,上移動鼠標,得到

文件 「... /查科/工具/ scatter_inspector.py」,第48行,在normal_mouse_move指數= plot.map_index((event.x,event.y),閾值= self.threshold)

視圖.enaml來源:

from enaml.widgets.api import (
     Window, Container, EnableCanvas, 
    ) 

enamldef ScatterView(Window): 
    attr controller 
    title = "Scatter Inspector Test" 
    initial_size = (640,480) 

    Container: 

     EnableCanvas: 
      component = controller.scatter_plot 

controller.py來源:

import enaml 
from enaml.stdlib.sessions import show_simple_view 
from traits.api import HasTraits, Instance 
from chaco.api import Plot, ArrayPlotData, ScatterInspectorOverlay 
from chaco.tools.api import ScatterInspector 
from numpy import linspace, sin 

class ScatterController(HasTraits): 
    scatter_plot = Instance(Plot) 

    def _scatter_plot_default(self): 
     # data 
     x = linspace(-14, 14, 100) 
     y = sin(x) * x**3 
     plotdata = ArrayPlotData(x = x, y = y) 

     # plot 
     scatter_plot = Plot(plotdata) 
     renderer = scatter_plot.plot(("x", "y"), type="scatter", color="red") 

     # inspector 
     scatter_plot.tools.append(ScatterInspector(scatter_plot)) 

     # overlay 
     # scatter_plot.overlays.append(ScatterInspectorOverlay(
     #   scatter_plot, 
     #   hover_color = 'red', 
     #   hover_marker_size = 6, 
     #   selection_marker_size = 6, 
     #   selection_color = 'yellow', 
     #   selection_outline_color='purple', 
     #   selection_line_width = 3 
     # )) 

     #return 
     return scatter_plot 

if __name__ == "__main__": 
    with enaml.imports(): 
     from view import ScatterView 

    main_controller = ScatterController() 
    window = ScatterView(controller=ScatterController()) 
    show_simple_view(window) 

回答

2

與我上面的代碼的問題是,我是加入ScatterInspectorscatter_plot而不是renderer和我是缺少[0]索引得到renderer

但是,當鼠標懸停在數據點和/或數據點被選中時,我真正想要做的關鍵是要被通知。我添加了when_hover_or_selection_changes,它顯示瞭如何做到這一點。

工作controller.py:

... 
# plot 
scatter_plot = Plot(plotdata) 
renderer = scatter_plot.plot(("x", "y"), type="scatter", color="lightblue")[0] 

# inspector 
renderer.tools.append(ScatterInspector(renderer)) 

# overlay 
renderer.overlays.append(ScatterInspectorOverlay(renderer, 
       hover_color="red", 
       hover_marker_size=6, 
       selection_marker_size=6, 
       selection_color="yellow", 
       selection_outline_color="purple", 
       selection_line_width=3)) 

... 

# get notified when hover or selection changes 
@on_trait_change('renderer.index.metadata') 
def when_hover_or_selection_changes(self): 
    print 'renderer.index.metadata = ', self.renderer.index.metadata  
+0

這幾乎是對我的作品 - 圖形用戶界面來了,我可以選擇用鼠標散點圖點,但在'when_hover_or_selection_changes'似乎沒有了'print'執行。注意我必須添加'from traits.api import on_trait_change'。你知道一種調試方法嗎? – meowsqueak 2013-10-29 09:12:18

+0

如果有幫助,使用https://svn.enthought.com/enthought/wiki/OnTraitChangeDispatch中的DebugWrapper,當點擊一個點時,我會看到以下內容:'通知:>()'和 '處的ScatterPlot對象'0x114f805f0 >>,'metadata_changed', meowsqueak 2013-10-29 09:28:04

+0

實際上,我不確定這個'@ on_trait_change'行的縮進級別應該是多少。它應該是'ScatterController'的方法,還是在_scatter_plot_default函數中的函數定義,如上面的格式所示?我已經嘗試了兩種。編輯:因爲它引用'self.renderer'我會去與它是一個普通的類方法。但是這也表明self.renderer需要設置在某個地方。在上面的代碼中,它沒有設置。 – meowsqueak 2013-10-29 09:33:40