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

标题:在plot中CursorTool的小毛病

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

我写了一个例子,你看看吧:

http://hyry.dip.jp/code.py?id=114

关键是第48行。

2011年11月25日 星期五 12:09

今天一大早爬起来,

发现这个写错了,

self.plotview.current_index=0

应改为:

self.plotview.cursor.current_index = 0

已经正常运作。

上午网络不好,一直没能上来。

谢谢若愚哥哥。

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

    你的回复:

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

    Zeuux © 2024

    京ICP备05028076号