В следующем коде я отображаю один и тот же график в двух кадрах. Сначала я добавляю аннотацию, когда на нее наведена мышь. Второй просто я показываю график в другом кадре. проблема в том, что когда я возвращаюсь к наведению курсора на первый график, возникает ошибка «RuntimeError: обернутый объект C / C ++ типа FigureCanvasWxAgg был удален»
import wx
import matplotlib
matplotlib.interactive(True)
matplotlib.use('WXAgg')
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
import numpy as np
class GrpahGenerator:
def generate_Graph(self):
self.figure = Figure(figsize=(6, 4), dpi=100)
self.axes = self.figure.add_subplot(111)
self.axes.bar(range(10), 20 * np.random.rand(10))
return self.figure
class Frame2(wx.Frame):
def __init__(self, title,fig):
wx.Frame.__init__(self, None, title=title, pos=(150,150), size=(800,600))
self.figure1=fig
self.panel = wx.Panel(self)
self.canvas = FigureCanvas(self.panel, wx.ID_ANY, self.figure1)
class Frame(wx.Frame):
def __init__(self, title,fig):
wx.Frame.__init__(self, None, title=title, pos=(150,150), size=(800,600))
self.figure=fig
self.panel = wx.Panel(self)
saveButton = wx.Button(self.panel, label='generate', pos=(50, 5), size=(80, 25))
saveButton.Bind(wx.EVT_BUTTON, self.OnButtonClick)
self.canvas = FigureCanvas(self.panel, wx.ID_ANY, self.figure)
for ax in self.figure.axes:
self.annot = ax.annotate("", xy=(0, 0), xytext=(-20, 20), textcoords="offset points",
bbox=dict(boxstyle="round", fc="black", ec="b", lw=2),
)
self.canvas.figure.canvas.mpl_connect('motion_notify_event', self.on_motion)
def OnButtonClick(self,event):
# figure1=GrpahGenerator()
top = Frame2("test",self.figure)
top.Show()
def on_motion(self, event):
vis = self.annot.get_visible()
axs = event.inaxes
for i, artist in enumerate(axs.patches):
con, ind = artist.contains(event)
if con:
self.update_annot(ind, artist, str(artist.get_facecolor()))
self.figure.canvas.draw_idle()
self.annot.set_visible(True)
else:
if vis:
self.figure.canvas.draw_idle()
def update_annot(self, ind,artist, text):
x, y = artist.xy
self.annot.xy = (x, y)
self.annot.set_text(text)
self.annot.get_bbox_patch().set_alpha(0.4)
app = wx.PySimpleApp()
fig = GrpahGenerator()
figure=fig.generate_Graph()
top = Frame("test",figure)
top.Show()
app.MainLoop()
И когда я изменяю функцию обратного вызова для кнопки, чтобы генерировать новый экземпляр
графика, как это все работает нормально
def OnButtonClick(self,event):
figure1=GrpahGenerator()
top = Frame2("test",figure1.generate_Graph())
top.Show()
я хочу не строить график снова, потому что мой реальный график
генерация занимает много времени и замораживает GUI