chaco - сделать так, чтобы несколько контейнеров отображали отдельные сюжеты

Я написал класс рисования чако, который отображает некоторые данные и позволяет пользователю взаимодействовать с ними. Затем я хотел создать графический интерфейс TraitsUI с несколькими различными экземплярами этого графика чако, чтобы пользователь мог иметь несколько графиков и взаимодействовать с ними независимо.

Однако, когда я пытаюсь реализовать это, я, кажется, понимаю, что каждый из отдельных экземпляров моего графика чако отображает все данные со всех графиков. Ниже я сделал очень простой графический интерфейс, который воспроизводит проблему.

В приведенном ниже примере я хотел бы, чтобы на каждой вкладке отображался контейнер с однострочным графиком. Однако кажется, что в каждом контейнере отображаются все графики, построенные в любом из контейнеров. Из документации здесь документация контейнера chaco, я думаю, что Я сделал, должно работать.

Я также пытался использовать представление ListEditor, но у него та же проблема.

Я что-то неправильно понимаю о контейнерах чако? Как заставить каждый экземпляр контейнера работать независимо? Любая помощь будет оценена по достоинству.

Спасибо!

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()

person user2175850    schedule 16.08.2016    source источник


Ответы (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(...). (Это имеет смысл)

Если это изменение будет сделано, вы получите желаемую функциональность.

person user2175850    schedule 08.09.2016