2016-08-16 60 views
1

我寫了一個chaco繪圖類,繪製了一些數據並允許用戶與之交互。然後,我想創建一個TraitsUI GUI,該GUI有幾個不同的chaco plot實例,這樣用戶可以有幾個繪圖並獨立與它們交互。chaco - 製作幾個容器顯示單獨的地塊

但是,當我嘗試並實現這一點時,我似乎得到我的chaco圖的每個單獨實例都顯示了所有圖的所有數據。我在下面製作了一個非常簡單的GUI,重現了這個問題。

在下面的示例中,我希望每個選項卡都顯示帶有單線圖的容器。但是,每個容器似乎都繪製了任何容器中繪製的所有地塊。從這裏的文檔chaco container docs,我認爲我所做的應該工作。

我也試過使用ListEditor視圖,但是這有同樣的問題。

我對chaco容器有些誤解嗎?我怎樣才能讓每個容器實例獨立行動?任何幫助,將不勝感激。

謝謝!

import enthought.chaco.api as chaco 
import enthought.traits.api as traits 
import enthought.traits.ui.api as traitsui 
from enthought.enable.api import ComponentEditor 
import scipy 


class BasicPlot(traits.HasTraits): 

    container = chaco.Plot(padding=(120,20,20,40), bgcolor="white", 
            use_backbuffer = True, 
            border_visible = True, 
            fill_padding = True) 



    traits_view = traitsui.View(traitsui.Item('container', editor = ComponentEditor(), show_label = False), 
         width = 500, height = 500, 
         resizable = True, title = "My line plot") 

    def __init__(self, n, *args, **kw): 
     super(BasicPlot, self).__init__(*args, **kw) 
     xs = scipy.linspace(0, 6.3, 1000) 
     ys = scipy.sin(n*xs) 
     plot = chaco.create_line_plot([xs,ys]) 
     self.container.add(plot) 
     chaco.add_default_grids(plot) 
     chaco.add_default_axes(plot) 

class tabbedPlots(traits.HasTraits): 

    bp1 = BasicPlot(1) 
    bp2 = BasicPlot(2) 

    bpGroup = traitsui.Group(traitsui.Item("bp1", editor = traitsui.InstanceEditor(), style="custom", show_label=False), 
           traitsui.Item("bp2", editor = traitsui.InstanceEditor(), style="custom", show_label=False), layout="tabbed") 

    traits_view = traitsui.View(bpGroup,title = "Log File Plots")  


class tabbedPlotsList(traits.HasTraits): 

    bps = traits.List(BasicPlot) 


    bpGroup = traitsui.Group(
         traitsui.Item('bps',style="custom", 
             editor=traitsui.ListEditor(use_notebook=True, deletable=True,export = 'DockWindowShell', page_name=".name") 
             ,label="logFilePlots", show_label=False) 
            ) 

    traits_view = traitsui.View(bpGroup,title = "Log File Plots") 

    def __init__(self, **traitsDict): 
     super(tabbedPlotsList, **traitsDict) 
     self.bps = [BasicPlot(n) for n in range(0,8)] 

if __name__=="__main__": 

    gui = tabbedPlots() 
    gui.configure_traits() 
    gui2 = tabbedPlotsList() 
    gui2.configure_traits() 

回答

1

我找到了解決這個問題的方法。

def __init__(self, n, *args, **kw): 
    super(BasicPlot, self).__init__(*args, **kw) 
    self.container = chaco.Plot(padding=(120,20,20,40), bgcolor="white", 
            use_backbuffer = True, 
            border_visible = True, 
            fill_padding = True) 
    xs = scipy.linspace(0, 6.3, 1000) 
    ys = scipy.sin(n*xs) 
    plot = chaco.create_line_plot([xs,ys]) 
    self.container.add(plot) 
    chaco.add_default_grids(plot) 
    chaco.add_default_axes(plot) 

爲了使其工作正常,容器不能是類屬性。相反,它必須在init中定義爲self.container(...)。 (這是有道理的)

如果做出這種更改,您將獲得所需的功能。