gpt4 book ai didi

python - matplotlib:如何刷新 figure.canvas

转载 作者:太空狗 更新时间:2023-10-29 17:07:23 26 4
gpt4 key购买 nike

我不明白如何刷新 FigureCanvasWxAgg 实例。这是示例:


import wx
import matplotlib
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.figure import Figure

class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.NewId(), "Main")
self.sizer = wx.BoxSizer(wx.VERTICAL)

self.figure = Figure(figsize=(1,2))
self.axe = self.figure.add_subplot(111)
self.figurecanvas = FigureCanvas(self, -1, self.figure)

self.buttonPlot = wx.Button(self, wx.NewId(), "Plot")
self.buttonClear = wx.Button(self, wx.NewId(), "Clear")

self.sizer.Add(self.figurecanvas, proportion=1, border=5, flag=wx.ALL | wx.EXPAND)
self.sizer.Add(self.buttonPlot, proportion=0, border=2, flag=wx.ALL)
self.sizer.Add(self.buttonClear, proportion=0, border=2, flag=wx.ALL)
self.SetSizer(self.sizer)

self.figurecanvas.Bind(wx.EVT_LEFT_DCLICK, self.on_dclick)
self.buttonPlot.Bind(wx.EVT_BUTTON, self.on_button_plot)
self.buttonClear.Bind(wx.EVT_BUTTON, self.on_button_clear)

self.subframe_opened = False

def on_dclick(self, evt):
self.subframe = SubFrame(self, self.figure)
self.subframe.Show(True)
self.subframe_opened = True

def on_button_plot(self, evt):
self.axe.plot(range(10), color='green')
self.figurecanvas.draw()

def on_button_clear(self, evt):
if self.subframe_opened:
self.subframe.Close()
self.figure.set_canvas(self.figurecanvas)
self.axe.clear()
self.figurecanvas.draw()


class SubFrame(wx.Frame):
def __init__(self, parent, figure):
wx.Frame.__init__(self, parent, wx.NewId(), "Sub")
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.figurecanvas = FigureCanvas(self, -1, figure)
self.sizer.Add(self.figurecanvas, proportion=1, border=5, flag=wx.ALL | wx.EXPAND)
self.SetSizer(self.sizer)

self.Bind(wx.EVT_CLOSE, self.on_close)

def on_close(self, evt):
self.GetParent().subframe_opened = False
evt.Skip()



class MyApp(wx.App):
def OnInit(self):
frame = MainFrame()
frame.Show(True)
self.SetTopWindow(frame)
return True

app = MyApp(0)
app.MainLoop()

我对以下操作序列感兴趣:

  • 运行脚本
  • 调整主框架
  • 按绘图按钮
  • 双击绘图
  • 按清除按钮

现在我在主框架图上弄得一团糟。如果我调整框架大小,它会正确重绘。我的问题是我应该在我的代码中添加什么才能在不调整大小的情况下做到这一点?

“乱七八糟”的意思是这样的:

http://img227.imageshack.us/img227/5407/mess.png

提前致谢。

最佳答案

正如我在评论中所说,我不认为图形 Canvas 刷新是你的问题,事实上我认为它正在做它应该做的事情(根据它的最后状态重新绘制自己[即它在你的子情节])。我认为你的问题更多的是 wxFrame 没有刷新。

解决这个问题的最简单方法是让它在您的“清除”事件中自行调整大小。像这样的东西:

def on_button_clear(self, evt):
if self.subframe_opened:
self.subframe.Close()
self.figure.set_canvas(self.figurecanvas)
self.axe.clear()
self.figurecanvas.draw()
self.SetSize((self.Size[0],self.figurecanvas.Size[1]))

设置的大小会导致框架及其包含的所有控件被重绘。

也就是说,我认为在两个 figurecanvas 之间共享您的图形很危险。通过以不同的组合单击/调整大小,我能够产生一些严重的错误。有时,您的图形会在子框架关闭时被垃圾收集,从而使其对您的主框架不可用。

关于python - matplotlib:如何刷新 figure.canvas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2441906/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com