Можно ли ограничить блокировку mainl oop в matplotlib одним окном / фигурой? - т.е. fig.show (blocking = True) - PullRequest
1 голос
/ 10 января 2020

У меня есть временная история изображений (2 + 1) D массивов, которые я беру с различными кусочками и проверяю, используя ipython, и каждое представление представляет собой фигуру matplotlib.

У меня есть собственный класс, который использует виджеты matplotlib (в частности, Slider), чтобы позволить интерактивному окну открывать и просматривать изображения кадр за кадром, как выбранный Slider. Виджет работает нормально, но для блокировки использует команду plt.show(), что тоже хорошо, пока я не закончу с виджетом.

Чтобы передать управление обратно в командную строку i python, мне нужно закрыть все рисунки matplotlib - я хотел бы иметь возможность только закрыть окно, связанное с виджетом. Есть ли какой-нибудь метод для включения этой функции?
Что-то вроде fig.show(blocking=True) было бы тем, что я представляю себе, то есть, ограничивало блокировку GUI mainl oop только поиском plt.close () этого окна , но, похоже, в настоящее время это не реализовано.

@ ImportanceOfBeingEarnest, спасибо за ответ. Я добавил код, который я использую для виджета просмотра. Для инициализации объекта вам просто нужно предоставить трехмерный массив значений [frames (t), y, x]. т.е.

randomData = np.random.rand((5,5,5))

class showFrames(object):
def __init__(self, timeData):
    self.data = timeData   # 3D array of t, y, x values
    self.fig, self.ax = plt.subplots(1)
    self.im = None
    self.frameStr = None
    self.start()

def start(self):
    # initialize GUI
    Tmin = self.data.min()
    Tmax = self.data.max()
    frameInit = self.data.shape[0] - 1
    self.im = self.ax.imshow(self.data[frameInit])
    self.im.set_clim(Tmin, Tmax)
    self.fig.colorbar(self.im)
    self.frameStr = self.ax.text(0.1, 0.1, '', transform=self.ax.transAxes, color='white')
    axis_color = 'yellow'
    # Add frame and radius slider for tweaking the parameters
    frame_slider_ax  = self.fig.add_axes([0.25, 0.05, 0.65, 0.03], axisbg=axis_color)
    frame_slider = Slider(frame_slider_ax, 'Frame', 0, frameInit, valinit=frameInit)
    frame_slider.on_changed(self.frame_slider_on_changed)
    plt.show()

def frame_slider_on_changed(self, i):
    self.im.set_data(self.data[int(i)])
    self.frameStr.set_text(str(int(i)))
    self.fig.canvas.draw_idle()

1 Ответ

1 голос
/ 11 января 2020

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

Из Slider документации :

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

В этом случае self.slider=Slider(...) вместо slider=Slider(...).

...