Использование возвращаемого значения из прямоугольного патча

Больше удовольствия: я пытаюсь передать значения после регистрации события on_release с помощью прямоугольного патча (с фиксированной шириной).

Все работает как надо, за исключением того, что я не могу передать значения в нужную тестовую функцию print_me (если только я не делаю что-то совершенно бессмысленное).

Кроме того, я пытаюсь установить значения с помощью текста в y-вершинах после того, как произойдет on_release, но опять же, безуспешно.

В идеале я хотел бы иметь 2 перетаскиваемых горизонтальных линии, но я думаю, что это сработает.

Мой тестовый код:

# from http://stackoverflow.com/questions/12052379/matplotlib-draw-a-selection-area-in-the-shape-of-a-rectangle-with-the-mouse
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle

class Annotate(object):
    def __init__(self):
        self.ax = plt.gca()
        self.rect = Rectangle((0,0), 1000, 1, alpha=.5, ec="gray", fc="w", zorder=1)
        print(self.rect)
        self.x0 = None
        self.y0 = None
        self.x1 = None
        self.y1 = None
        self.ax.add_patch(self.rect)
        self.ax.figure.canvas.mpl_connect('button_press_event', self.on_press)
        self.ax.figure.canvas.mpl_connect('button_release_event', self.on_release)

    def on_press(self, event):
        print ('press')
        self.x0 = event.xdata
        self.y0 = event.ydata

    def on_release(self, event):
        print ('release')
        #self.x1 = event.xdata
        self.y1 = event.ydata
        print(self.y0)
        print(self.y1)
        self.rect.set_width(50000)
        self.rect.set_height(self.y1 - self.y0)
        self.rect.set_xy((-10, self.y0))
        self.text.set_text(str(self.y0))
        self.text.set_position((self.get_path()))
        self.ax.figure.canvas.draw()
        print_me(str(self.y1))

a = Annotate()
plt.show()

def print_me(v):
    print('Yo!')
    print(v)

person horcle_buzz    schedule 21.03.2017    source источник


Ответы (1)


  1. Вам нужно определить self.text, если вы хотите его использовать
  2. В классе Annotate нет метода get_path, замените его другим.
  3. Вам нужно определить функцию print_me над классом, если вы хотите использовать ее внутри.

Полный рабочий код:

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle

def print_me(v):
    print('Yo!')
    print(v)

class Annotate(object):
    def __init__(self):
        self.ax = plt.gca()
        self.rect = Rectangle((0,0), 1000, 1, alpha=.5, ec="gray", fc="w", zorder=1)
        self.text = self.ax.text(1,1,"")

        print(self.rect)
        self.x0 = None
        self.y0 = None
        self.x1 = None
        self.y1 = None
        self.ax.add_patch(self.rect)
        self.ax.figure.canvas.mpl_connect('button_press_event', self.on_press)
        self.ax.figure.canvas.mpl_connect('button_release_event', self.on_release)

    def on_press(self, event):
        print ('press')
        self.x0 = event.xdata
        self.y0 = event.ydata

    def on_release(self, event):
        print ('release')
        #self.x1 = event.xdata
        self.y1 = event.ydata
        print(self.y0)
        print(self.y1)
        self.rect.set_width(50000)
        self.rect.set_height(self.y1 - self.y0)
        self.rect.set_xy((-10, self.y0))
        self.text.set_text(str(self.y0))
        self.text.set_position((0, self.y0))
        self.ax.figure.canvas.draw()
        print_me(str(self.y1))

a = Annotate()
plt.show()
person ImportanceOfBeingErnest    schedule 21.03.2017
comment
Ха! Я знал, что это было что-то очевидное. Как всегда, спасибо! - person horcle_buzz; 22.03.2017