2011年11月24日 星期四 19:51
在编写一个小的plot程序中,加入了CursorTool工具
一切工作良好
但是在动态的改变了ArrayPlotData中的x,y值后
CursorTool工具就跑到了新绘制图形的边上,可以明显看到用于绘制十字架的蓝色线条
但是鼠标无法选中CursorTool
能否有办法使CursorTool的位置默认在新的数据的中间,或者鼠标可以操作的地方。~~
2011年11月24日 星期四 20:01
我试图在利用:
def _plotdata_changed( self ):
self.cursor.current_position = 0.0, 0.0
引发了:
Exception occurred in traits notification handler for object: <__main__.PlotView object at 0x041C1540>, trait: plotdata, old value: None, new value:
Traceback (most recent call last):
File "C:\Python26\lib\site-packages\traits-3.3.0-py2.6-win32.egg\enthought\traits\trait_notifiers.py", line 344, in call_1
self.handler( object )
File "C:\Users\Zxy\Documents\Python\GrevityDataProcess0.2\src\com\zxy\GrevityProcess\form\PlotViewM.py", line 71, in _plotdata_changed
self.cursor.current_position = 0.0, 0.0
AttributeError: 'NoneType' object has no attribute 'current_position'
无法访问到self.cursor
估计是在plot的ArrayPlotData实例初始化时触发了这个方法,但是这个时候cursor的实例还没有生产。
应该怎么写才能准确的触发呢?
2011年11月24日 星期四 20:37
不能在动态的改变了ArrayPlotData的x,y时修改self.cursor.current_position吗?
如果你在_plotdata_changed中修改的话,也可以先判断一下:
if self.cursor:
self.cursor.current_position = 0.0, 0.0
2011年11月24日 星期四 21:05
是可以的,刚刚没有像到。
我也是这样判断之后修改 self.cursor.current_position为0.0,0.0
但是这样只有index的值变动到了0,而value变动到了一个非常大的值
我给plot加入了zoomtool,看到,cursor的中心跑到了更新后的曲线的下方。
而且无法拖拽
我查看了CursorTool的源码:
@cached_property
def _get_current_position(self):
plot = self.component
ndx = self.current_index
x = plot.index.get_data()[ndx]
y = plot.value.get_data()[ndx]
return x,y
它本身是一个属性,
当我更新数据x,y时,current_position本身并没有发生改变,
于是我在想让plot本身重绘
def _plotdata_changed( self ):
if self.cursor:
# self.cursor.current_position = 5.0, 5.0
plot = self.componen
plot.request_redraw()
我不知道这样写本身有没有问题,不过依然没有效果。
2011年11月24日 星期四 22:29
既然current_position()是一个property,那么你可以设置cursor.current_index
例如cursor.current_index = len(x)/2,
2011年11月24日 星期四 22:57
依然没有效果,cursor的位置仍然停留在更改数据之前的值。
有不有可能是因为cursor并不直接依赖于ArrayPlotData中的x,y
而是初始化之后,在metadata中创建了自己所的依赖值。
还是没有想清楚·。
不过我感觉,问题可能出在:
def _plotdata_changed( self ):
if self.cursor:
# self.cursor.current_position = 5.0, 5.0
plot = self.componen
plot.request_redraw()
因为这个是事件,除了在初始化的时候激发了一次
其他的时候都没有响应。
我也尝试在变更X,Y数据的时候设置cursor的current_index和current_position
也都没有效果。
好没有道理的。
2011年11月25日 星期五 06:59
所以你可以在_plotdata_changed添加一个print语句,看看它是否被调用。如果他不被调用,那么就不能在这里修改了。
你的数据是如何修改的,在修改数据之后修改cursor.current_index不行吗。
2011年11月25日 星期五 07:09
我看了一下源代码,CursorTool中有_set_current_position,因此也可以直接设置current_position。你把完整的程序贴出来,我看看吧。
2011年11月25日 星期五 08:58
2011年11月25日 星期五 12:09
今天一大早爬起来,
发现这个写错了,
self.plotview.current_index=0
应改为:
self.plotview.cursor.current_index = 0
已经正常运作。
上午网络不好,一直没能上来。
谢谢若愚哥哥。
Zeuux © 2024
京ICP备05028076号