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 © 2024
京ICP备05028076号