【问题标题】:Matplotlib and WxPython - Interactive Toolbar Plot not doing a Refresh/Update on clickMatplotlib 和 WxPython - 交互式工具栏绘图在单击时不执行刷新/更新
【发布时间】:2015-03-03 01:59:20
【问题描述】:

我正在尝试将 matplotlib 集成到 wxpython GUI 中,并且我已经成功地显示了交互式导航工具栏。但是,按下任何按钮都不会更改绘图,如果您重新调整窗口大小或按下另一个按钮(即缩放)并应用相关操作(选择一个盒子/区域)。我尝试在网上查找,但大多数答案要么没有回答这个特定问题,要么似乎与我的查询相匹配的问题没有得到解答。下面是一段相关代码:

忽略所有大量的更新/刷新调用,我只是试图让帧/情节刷新,但它没有用。有什么想法吗?

 class p1(wx.Panel):
        def __init__(self, parent):
            wx.Panel.__init__(self, parent, -1, size=(50,50))

            #Set up Figure
            self.figure = matplotlib.figure.Figure()
            self.canvas = FigureCanvas(self, -1, self.figure)

            #Set up Matplotlib Toolbar
            self.chart_toolbar = NavigationToolbar2Wx(self.canvas)
            tw,th = self.chart_toolbar.GetSizeTuple()
            fw,fh = self.canvas.GetSizeTuple()
            self.chart_toolbar.SetSize(wx.Size(fw, th))
            self.chart_toolbar.Realize()

            graphs_sizer = wx.BoxSizer(wx.VERTICAL)

            graphs_sizer.Add(self.canvas, 20, flag=wx.EXPAND, border=5)
            graphs_sizer.Add(self.chart_toolbar, 1, flag=wx.ALIGN_CENTER, border=5)

            self.SetSizer(graphs_sizer)
            self.chart_toolbar.update()
            self.canvas.Update()
            self.canvas.Refresh()
            self.Update()

        def plot(self):
            self.axes = self.figure.add_subplot(111)
            self.axes.plot(aggregatePlot,color='blue',alpha=0.6,lod=True)
       
            self.canvas.draw()
            self.canvas.Update()
            self.canvas.Refresh()

    class TestFrame(wx.Frame):
        def __init__(self, parent, title):
            wx.Frame.__init__(self, parent, title=title, size=(200,200))

            #Create Splitter Window and Add Left/Right Panels
            self.sp = wx.SplitterWindow(self)
            self.p1 = p1(self.sp)
            self.p2 = wx.Panel(self.sp, style=wx.SUNKEN_BORDER)
            self.sp.SplitVertically(self.p1, self.p2, 100)

            #Create Buttons
            self.siButton = wx.Button(self.p1, -1, "Si", size=(40,20), pos=(10,10))
            self.siButton.Bind(wx.EVT_BUTTON, self.Si)

            self.siButton = wx.Button(self.p2, -1, "No", size=(40,20), pos=(10,10))
            self.siButton.Bind(wx.EVT_BUTTON, self.No)

            #Create Status Bar
            self.statusbar = self.CreateStatusBar()
            self.statusbar.SetStatusText("Hola")

            #Plot
            self.p1.plot()

        #Event Handlers
        def Si(self, event):
            self.statusbar.SetStatusText("Si")

        def No(self, event):
            self.statusbar.SetStatusText("No")

    app = wx.App(redirect=False)
    frame = TestFrame(None, 'Hello World!')
    frame.Show(True)
    frame.p1.plot()
    frame.p1.canvas.Update()
    frame.p1.canvas.Refresh()
    app.MainLoop()

下面是一个示例,按下缩放按钮并选择了一个矩形区域进行缩放,但没有任何反应。缩放矩形也有很多小的内部矩形,但实际的图形并没有改变。

【问题讨论】:

  • 我不知道您到底期望什么:您正在绘制恰好一次,那么您为什么希望绘图发生变化(缩放/缩放除外)?更好的说法是,您正在绘制两次,但第二次 frame.p1.plot() 是空操作,因为 aggregatePlot 不应该更改。
  • 对不起,我可能解释的不正确,我感觉不对的一个例子是我点击了缩放按钮,选择了一个矩形区域来放大绘图。现在根据我对 matplotlib 的了解,绘图应该变成放大的区域。现在实际上什么都没有发生。现在,如果我选择平移并移动一点,或者调整整个绘图的大小,图形会变为我之前放大的位置,然后平移动作发生。这有意义吗?
  • 没关系,请看下面的答案,我的matplotlib版本可能有问题,更新修复了它。

标签: python matplotlib wxpython toolbar wxwidgets


【解决方案1】:

matplotlib 的更新刚刚解决了我的问题,不确定是什么问题,但我在网上发现了一个与我所面临的问题类似的错误,它似乎是内部的。我刚刚使用 conda 来更新我的 matplotlib 版本,通过运行:

conda update matplotlib

谢谢!

【讨论】:

  • 请问您使用的是哪个版本,您现在使用的是哪个版本?我也看到了这个问题。
  • 我不记得我使用的是哪个版本,但我只是检查了当前版本,它是 1.4.3 。希望对您有所帮助!
  • 谢谢。是的,我正在使用 1.3 的东西,前几天更新到 1.4.3。没想到检查这个问题是否解决了,似乎已经解决了。感谢您发布此信息!
  • 没问题,很高兴它有帮助!
猜你喜欢
  • 2013-06-11
  • 2018-04-28
  • 1970-01-01
  • 2017-03-18
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多