chaco - 制作几个容器显示单独的图

时间:2016-08-16 13:03:43

标签: traits traitsui chaco

我编写了一个chaco绘图类,它绘制了一些数据并允许用户与之交互。然后我想创建一个TraitsUI GUI,它有几个不同的chaco图实例,以便用户可以拥有多个图并独立地与它们交互。

然而,当我尝试实现这一点时,我似乎得到了我的chaco图的每个单独实例都显示了所有图中的所有数据。我在下面制作了一个非常简单的GUI来重现问题。

在下面的示例中,我希望每个标签显示一个带有单线图的容器。但是,每个容器似乎都绘制了在任何容器中绘制的所有绘图。从这里的文档chaco container docs,我认为我所做的应该有效。

我也尝试过使用ListEditor视图,但这也存在同样的问题。

我是否误解了有关chaco Containers的事情?如何让每个容器实例独立操作?任何帮助将不胜感激。

谢谢!

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 个答案:

答案 0 :(得分: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(...)。 (这很有意义)

如果进行了此更改,您将获得所需的功能。