实际上这应该是一个相当简单的问题,但我正在经历相当陡峭的学习曲线的查科和特征…
我目前正在编写一个应用程序,使用查科和特征绘制医学图像,我只是想从图像中选择一个像素位置,并使用这个像素位置对图像堆栈进行评估。所以我开始写我自己的Chaco工具,当鼠标点击图像时,它会做出反应。到目前为止,这一切都很好。当我点击imageplot时,我可以在工具(一个自定义的PixelPickerTool)中看到鼠标坐标。然而,由于我想在工具外部使用这个坐标值,我的问题是:当事件触发时,我如何将坐标移交给工具外部的另一个对象或变量。
为了说明我想做什么,我附上了我正在编写的两个类的主要结构:
class PixelPickerTool(BaseTool):
'''Pick a Pixel coordinate from an image'''
ImageCoordinates = [0,0]
def normal_left_down(self, event):
print "Mouse:", event.x, event.y,
click_x, click_y = self.component.map_data((event.x, event.y))
img_x = int(click_x)
img_y = int(click_y)
coord = [img_x, img_y]
if ( (img_x > self.ImageSizeX) or (img_x < 0) ):
coord = [0,0]
if ( (img_y > self.ImageSizeY) or (img_y < 0) ):
coord = [0,0]
print coord
# this print gives out the coordinates of the pixel that was clicked - this works fine...
# so inside the picker too I can get the coordinates
# but how can I use the coordinates outside this tool ?
class ImagePlot(HasTraits):
# create simple chaco plot of 2D numpy image array, with a simple interactor (PixelPickerTool)
plot = Instance(Plot)
string = String("hallo")
picker = Instance(PixelPickerTool)
traits_view = View(
Item('plot', editor=ComponentEditor(), show_label=False,width=500, height=500, resizable=False),
Item('string', show_label=False, springy=True, width=300, height=20, resizable=False),
title="")
def __init__(self, numpyImage):
super(ImagePlot, self).__init__()
npImage = np.flipud(np.transpose(numpyImage))
plotdata = ArrayPlotData(imagedata = npImage)
plot = Plot(plotdata)
plot.img_plot("imagedata", colormap=gray)
self.plot = plot
# Bild Nullpunkt ist oben links!
self.plot.default_origin = 'top left'
pixelPicker = PixelPickerTool(plot)
self.picker = pixelPicker
plot.tools.append(pixelPicker)
我想在这个ImagePlot类的某个地方使用PixelPickerTool测量的坐标。例如,通过将它们移交给另一个对象,如MyImageSeries.setCoordinate(xy_coordinatefrommpickertool)那么,当事件被触发时,我如何将像素坐标从PickerTool移交给该类中的某些成员变量呢?也许是这样的:self。PixelCoordinates = picker.getPixelCoordinates()可以工作吗?但是我怎么知道,当on_normal_left_down函数在选择器中执行时?
最后,我想把坐标交给另一个类,它拥有更多的图像来处理图像,并在ImagePlot中确定的像素位置进行匹配。我试图在我的imagePlot类中使用类似"_picker_changed"的东西来检测是否在PickerTool中触发了事件,但这并没有检测到事件的触发。所以也许我做错了什么…
谁能告诉我如何从这个选择器工具中获得事件和相关变量?
欢呼,
安德烈
"但是我怎么知道,当on_normal_left_down函数在选择器中执行时?"
可能有几种方法可以做到这一点,但其中一种方法是简单地执行您所要求的并触发您显式定义的事件。
例如:from traits.api import Event
class PickerTool(BaseTool):
last_coords = SomeTrait
i_fired = Event
def normal_left_down(self,event):
# do whatever necessary processing
self.last_coords = do_some_stuff(event.some_attribute)
# now notify your parent
self.i_fired = True
,然后听plot.picker。我从你想要显示的任何地方发射,并在plot.picker中查看。保存状态的last_coord。
如果你想对这些坐标做的事情非常简单,你可以做的另一件事可能会更简单,就是传递初始化数据结构,picker需要与之交互(或通过一系列调用self.parent获得它们),并直接在picker中完成你的工作。