удалить фигуру при использовании одного и того же экземпляра графика на месте буксировки - PullRequest
0 голосов
/ 17 апреля 2019

В следующем коде я отображаю один и тот же график в двух кадрах. Сначала я добавляю аннотацию, когда на нее наведена мышь. Второй просто я показываю график в другом кадре. проблема в том, что когда я возвращаюсь к наведению курсора на первый график, возникает ошибка «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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...