【发布时间】:2015-08-30 13:46:23
【问题描述】:
在 wxPython 应用程序中,我嵌入了一个带有 matplotlib 图的 FigureCanvas。我希望能够通过加载一个新的来切换图形。但是,该数字没有更新。
对类似主题的回答表明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()
【问题讨论】:
标签: python matplotlib wxpython