我在我的FigureCanvas
子类中放了一些代码,以便用鼠标拖动Text
个对象。以下是相关课程:
class MyCanvas(FigureCanvasQTAgg):
def __init__(self):
super(JBAFigureCanvas, self).__init__(self.figure)
self.figure = Figure()
self.axes = self.figure.add_subplot(111)
self.draggedArtist = None
FigureCanvas.setSizePolicy(self, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self)
self.setContentsMargins(0,0,0,0)
self.figure.patch.set_alpha(0.0)
self.mpl_connect("pick_event", self.pck_event)
self.mpl_connect("motion_notify_event", self.motion_event)
self.mpl_connect("button_release_event", self.release_event)
def pck_event(self, event):
""" Store which text object was picked and were the pick event occurs."""
if isinstance(event.artist, text.Text):
self.draggedArtist = event.artist
self.pick_pos = (event.mouseevent.x, event.mouseevent.y)
def on_release_event(self, event):
""" Update text position and redraw"""
if self.draggedArtist is not None:
bbox = self.draggedArtist.get_window_extent()
old_pos = bbox.xmin, bbox.ymin
canvasLoc = (old_pos[0] + event.x - self.pick_pos[0],
old_pos[1] + event.y - self.pick_pos[1])
new_pos=self.draggedArtist.get_transform().inverted().transform_point(canvasLoc)
self.draggedArtist.set_position(new_pos)
self.draggedArtist = None
self.draw()
如果我再写一些文字,就像这样:
axes.text(0.5, 0.5, 'testet', picker = True)
代码工作正常。
但是,如果我像这样制作一些文字:
figure.text(0.5, 0.5, 'test', picker = True)
生成的文本对象不可选。为了使它可以选择,我需要这样做:
figure.text(0.5, 0.5, 'test', picker = True, axes = ax)
(其中ax
是轴实例)。
我很难理解为什么没有设置Axes
的对象无法被选中? (我认为事件发生在画布层面(即独立于轴/图)..