В приложении wxPython у меня есть встроенный элемент фигуры с фигурой matplotlib. Я хочу иметь возможность переключать фигуру, загружая новую. Однако эта цифра не обновляется.Обновить wxpython рисунок фигуры с новым рисунком
Ответы на подобные темы предполагает, что panel.canvas.draw()
и panel.Refresh()
должен сделать трюк, но я также пытался panel.Update()
и panel.canvas.Refresh()
. Я боюсь, что это работает только если вы хотите перерисовать холст с тем же рисунком?
Итак, мой вопрос: как вы заменяете фигуру внутри холста и обновляете ее?
Ниже представлен небольшой (нерабочий) пример. Сначала фигура загружается одной осью. Если вы из встроенной оболочки типа panel.LoadFigure()
, новая фигура с 2x2 подзаголовками создается и помещается в холст. Но новая фигура не показана.
import numpy as np
import wx
from wx.py.shell import Shell
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
import matplotlib.pyplot as plt
class ShellPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.shell = Shell(self)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.sizer.Add(self.shell, 1, wx.GROW)
self.SetSizer(self.sizer)
self.Layout()
self.Fit()
class FigurePanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.parent = parent
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.figure, ax = plt.subplots()
self.canvas = FigureCanvas(self, -1, self.figure)
self.shellpanel = ShellPanel(self)
s1 = wx.BoxSizer(wx.VERTICAL)
s1.Add(self.canvas, 0, wx.GROW)
s1.Add(self.shellpanel, 1 , wx.EXPAND)
self.sizer.Add(s1, 5, wx.GROW)
self.SetSizer(self.sizer)
self.Layout()
self.Fit()
def LoadFigure(self):
self.figure, ax = plt.subplots(2, 2)
self.canvas.draw()
self.Refresh()
class FigureFrame(wx.Frame):
def __init__(self, parent, id, title, size):
wx.Frame.__init__(self, parent, id, title, size=size)
if __name__ == "__main__":
app = wx.App(False)
fr = FigureFrame(None, -1, title='Figure Loader', size=(wx.DisplaySize()[0]/2, wx.DisplaySize()[1]*3/4))
panel = FigurePanel(fr)
fr.Show()
app.MainLoop()
Причина в том, что Im загружает маринованные фигуры из файла. То есть 'fig = pickle.load (filename)'. Это дает новую цифру каждый раз. Поэтому я хочу обновить холст этой новой фигурой. Код примера, который я написал, несколько глупо, как вы показали в своем примере. – pathoren
@pathoren ОК, я понимаю сейчас. Я изменил свой ответ, чтобы предоставить вам что-то, что, я считаю, работает, но это не очень, возможно, есть лучший способ. –
Спасибо @Diziet. У меня было аналогичное решение, как план резервного копирования, но надеялся, что есть более чистый способ сделать это. Я жду, чтобы принять ваш ответ, чтобы узнать, есть ли другие предложения. – pathoren