Я пытаюсь создать свой собственный подкласс Figure и поместить в него некоторый виджет, но мне интересно, почему он не работает, если я генерирую виджеты внутри метода init класса, см. Пример кода ниже. Кнопка используется для перебора некоторых данных.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import gridspec
from matplotlib.figure import Figure
from matplotlib.widgets import Button
class MyFigure(Figure):
def __init__(self, *args, img: list, **kwargs):
super().__init__(*args, **kwargs)
self.ax_img = self.add_subplot()
self.img_list = img
self.index = 0
self.text = "btn was clicked"
self.btn = None
self.create_button() # if only here no interaction
def update_figure(self):
self.ax_img.imshow(self.img_list[self.index], cmap='jet')
# self.create_button() # if here it works, but why?
plt.draw()
def create_button(self):
ax_btn = self.add_axes([0.02, 0.28, 0.08, 0.04])
self.btn = Button(ax_btn, 'btn')
self.btn.on_clicked(self.on_btn_click)
def on_btn_click(self, event):
self.index += 1
print(self.text, self.index)
self.update_figure()
image = [np.random.rand(30, 30) for i in range(10)]
fig = plt.figure(FigureClass=MyFigure, img=image)
fig.update_figure()
plt.show()
только если метод вызывается в методе update_figure
, он работает, в противном случае кнопка помещается и отображается, но не является интерактивной, она также не не узнаю, что завис над ним.
Я использую Python 3.7 и Matplotlib 3.2.1