Python和科学计算认证群组  - 讨论区

标题:请教大家,关于两个plot联动问题

2011年09月15日 星期四 11:13

有左右两侧各一个Plot,

左侧plotA为Cursor Plot,仿照chaco的例子

cursor1=Instance(BaseCursorTool)

cursor1pos=DelegatesTo('cursor1',prefix='current_position')

将数据绑定在cursor1pos

右侧的plotB根据cursor1pos的横坐标,动态的显示二维数组中的对应的列

我的思路是,将plotA的实例传入到plotA,并访问cursor1pos:

a=LPlot()

b=Rplot(a=a)

self.plotA.append(a)

self.plotB.append(b)

但是程序出现

NoneType没有Ui属性

后来考虑依然将plotA的实例传入到plotB,之后通过DelegatesTo代理

依旧不成功。

请问,我的思路是否存在问题,或者有其他比较好的解决方法??

谢谢各位。

 

2011年09月15日 星期四 11:19

 

源代码如下:拜托大家帮忙看一下·~

写得不好~~

# -*- coding: utf-8 -*-

from enthought.traits.api import HasTraits,Instance,Str,Button,\

     List,Int,Tuple,DelegatesTo

from enthought.chaco.tools.cursor_tool import CursorTool,BaseCursorTool

from enthought.traits.ui.api import View,Item,Handler,Group,\

     HSplit,VSplit,HGroup,VGroup,ListEditor

from enthought.enable.api import ComponentEditor,Component

from enthought.enable.tools.api import DragTool

from enthought.traits.ui.menu import Action,ActionGroup,\

     Menu,MenuBar,ToolBar,ModalButtons

from enthought.chaco.tools.api import PanTool,ZoomTool

from enthought.chaco.api import Plot,ArrayPlotData

#代码输入区

########################################################################

class PointDraggingTool(DragTool):

"""

拖拽工具

"""

component=Instance(Component)

threshold=Int(5)

_drag_index=Int(-1)

_orig_value=Tuple

def is_draggable(self,x,y):

if self._lookup_point(x,y) is not None:

return True

else:

return False

def normal_mouse_move(self,event):

plot=self.component

ndx=plot.map_index((event.x,event,y),self.threshold)

if ndx is None:

if plot.index.metadata.has_key('selections'):

del plot.index.metadata['selections']

else:

plot.index.metadata['selections']=[ndx]

plot.invalidata_draw()

plot.request_redraw()

def drag_start(self, event):

plot = self.component

ndx = plot.map_index((event.x, event.y), self.threshold)

if ndx is None:

return

self._drag_index = ndx

self._orig_value = (plot.index.get_data()[ndx], plot.value.get_data()[ndx])

def dragging(self, event):

plot = self.component

data_x, data_y = plot.map_data((event.x, event.y))

plot.index._data[self._drag_index] = data_x

plot.value._data[self._drag_index] = data_y

plot.index.data_changed = True

plot.value.data_changed = True

plot.request_redraw()

def drag_cancel(self, event):

plot = self.component

plot.index._data[self._drag_index] = self._orig_value[0]

plot.value._data[self._drag_index] = self._orig_value[1]

plot.index.data_changed = True

plot.value.data_changed = True

plot.request_redraw()

def drag_end(self, event):

plot = self.component

if plot.index.metadata.has_key('selections'):

del plot.index.metadata['selections']

plot.invalidate_draw()

plot.request_redraw()

def _lookup_point(self, x, y):

if hasattr(self.component, 'get_closest_point'):

# This is on BaseXYPlots

return self.component.get_closest_point((x,y), threshold=self.threshold)

return None

class MainHandler(Handler):

def exit_app(self,info):

info.ui.control.Close()

def position(self,info):

info.ui.control.Maximize()

########################################################################

class LeftHandler(Handler):

"""左侧plot的事件处理类"""

#----------------------------------------------------------------------

def __init__(self):

"""Constructor"""

pass

class MainPlot(HasTraits):

plot=Instance(Plot)

cursor1=Instance(BaseCursorTool)

cursor1pos=DelegatesTo('cursor1',prefix='current_position')

pview=View(

Item(

   "plot",

   editor=ComponentEditor(size=(800,400)),

   style='custom',

   show_label=False,

       springy=True

   ),

   Item('cursor1pos',

        show_label=False

        )

)

def __init__(self,**traits):

#初始化视图

super(MainPlot,self).__init__(**traits)

#初始化代码

import random

fff=random.sample([i for i in xrange(100)],100)

arrayPlotData=ArrayPlotData(x=[i for i in xrange(100)],

                   #y=[i for i in xrange(100)]

                           y=fff

                   )

self.plot=Plot(arrayPlotData)

self.plot.padding=25

self.line=self.plot.plot(('x','y'),type='line',color='red')[0]

#设置line的数据排序

self.line.index.sort_order='ascending'

csr=CursorTool(self.line,

              drag_button='left',

              color='blue')

self.cursor1=csr

csr.current_position=0.0,0.0

self.line.overlays.append(csr)

self.line.tools.append(PanTool(self.line,drag_button='right'))

self.line.overlays.append(ZoomTool(self.line))

########################################################################

class LeftPlot(HasTraits):

"""左侧图形"""

#初始化对象

plot=Instance(Plot)

b_Save=Button('save')

b_ReSet=Button('reset')

mp=Instance(MainPlot)

pointDraggingTool=Instance(PointDraggingTool)

view=View(

   Item(

       'plot',

       editor=ComponentEditor(),

       style='custom',

       show_label=False

   ),

   HGroup(

       Item('b_Save',label='Save'),

       Item('b_ReSet',label='ReSet')

   )

)

#----------------------------------------------------------------------

def __init__(self,**traits):

"""Constructor"""

super(LeftPlot,self).__init__(**traits)

#self.Num=self.mp.cursor1pos 设想用直接访问方式得到数据

#print self.Num

class MainFrame(HasTraits):

status_info = Str

#UI声明区

button=Button('Click Me')

bn1=Button('Cancal')

plotA=List(Instance(MainPlot))

plotB=List(Instance(LeftPlot))

file_menu=Menu(

ActionGroup(

   Action(id='open',name=u'打开',action='open_file'),

   Action(id='save',name=u'保存',action='save_file'),

   ),

ActionGroup(

   Action(id='exit',name=u'关闭',action='exit_app'),

   ),

name=u'文件'

)

about_menu=Menu(

Action(id='about',name=u'关于',action='about_dia'),

name=u'帮助'

)

view=View(

VSplit(

   HSplit(

       Group(

           Item('button',

                style='custom',

                label=u'显示'

                ),

           Item('plotB',

                style='custom',

                show_label=False,

                editor=ListEditor(

                    use_notebook=True,

                    deletable=True,

                    dock_style='tab',

                    page_name='.name',

                    view='pview'

                    ),

                #配置plot视图的大小

                #width=250,

                #height=250

                )

           ),

       Group(

           Item('plotA',

                style='custom',

                show_label=False,

                editor=ListEditor(

                    use_notebook=True,

                    deletable=True,

                    dock_style='tab',

                    page_name='.name',

                    view='pview'

                    ),

                #配置plot视图的大小

                width=750,

                height=400

                )

           ),

       ),

   Group(

       Item('bn1',

            style='custom',

            label=u'取消'

            )

       ),

   show_border=True

   ),

menubar=MenuBar(file_menu,about_menu),

handler=MainHandler(),

resizable=True,

title=u'激电数据处理',

kind='live'

)

def __init__(self,**traits):

"""初始化函数"""

super(MainFrame,self).__init__(**traits)

mp=MainPlot()

np=LeftPlot(mp=mp)

self.plotB.append(np)

self.plotA.append(mp)

if __name__ == "__main__":

mf=MainFrame()

mf.configure_traits()

 

2011年09月15日 星期四 21:28

我粗略看了一下程序,

Item("PlotB",.... view="pview"),可是你的LeftPlot中没有定义pview,这样会出错的。

程序还需要好好整理一下,另外你贴的程序没有缩进,无法执行。

 

2011年09月16日 星期五 09:10

谢谢RY大哥,

最开始的时候担心两个plot的view重名,更改了两个plot的View的名字。

但是忘记更新MainFrame中引用的View的名称了。

却忘记了更改昨天早些时候已经发现这个错误了,现在已经可以正常运行了。

另外还想请教一下:

如何让整个程序支持多任务处理。

意思就是,如果我从List(plotA)的Tab标签中关闭一个,那么如何对应的将List(plotB)中的plot也移除,并且释放资源呢?

traitsUI_csv_viewer.py

我参考了这个例子。

但是对应要同时联动的删除两个plot还没有好的办法。

 

 

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号