我编写了一个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()
答案 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(...)。 (这很有意义)
如果进行了此更改,您将获得所需的功能。