2015-03-03 66 views
1

我想將matplotlib集成到wxpython GUI中,並且我已經獲得了交互式導航工具欄以成功顯示。但是,按下任何按鈕不會改變繪圖,如果您重新調整窗口的大小或者按下另一個按鈕(即縮放)並應用相關操作(選擇),繪圖僅會更改(基於上次按下的按鈕)一個盒子/區域)。我嘗試在網上查找,但大多數答案要麼沒有回答這個具體問題,要麼沒有回答那些看起來像他們匹配我的查詢的問題。以下是相關代碼的一部分:Matplotlib和WxPython - 交互式工具欄Plot沒有做點擊刷新/更新

忽略所有無數更新/刷新調用,我只是試圖讓框架/繪圖刷新,但它不起作用。有任何想法嗎?

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() 

一個例子如下所示,變焦按鈕被按下並且被選擇用於變焦的矩形區域,但沒有任何反應。縮放矩形也有很多小的內部矩形,但實際的圖形不會改變。

example of issue http://i59.tinypic.com/28beiq8.png

+0

我不知道你到底在想什麼:你正在繪製**一次**,所以你爲什麼會期望繪圖改變(除了縮放/縮放)?更好地說,你繪製了兩​​次,但第二個''frame.p1.plot()''是一個空操作,因爲''aggregatePlot''不應該改變。 – nepix32 2015-03-03 08:02:34

+0

對不起,也許我沒有正確解釋,我覺得是錯誤的一個例子是,我點擊縮放按鈕,選擇一個矩形區域放大的情節。現在從我所知道的matplotlib中,情節應該變成放大的區域。現在什麼都沒有發生。之後,如果我選擇平移並移動一點,或者調整整個繪圖的大小,那麼圖形會變成之前放大的位置,然後發生平移動作。那有意義嗎? – 2015-03-03 17:41:25

+0

沒關係,請看下面的答案,可能是我的matplotlib版本有問題,更新修復了它。 – 2015-03-03 18:07:48

回答

1

更新至matplotlib只是固定我的問題,不知道問題是什麼,但我發現了一個bug網上類似我面臨的問題,這似乎是內部的。我只是用conda來更新我的matplotlib版本,通過運行:

conda update matplotlib 

謝謝!

+0

我可以問你正在使用哪個版本,以及你現在使用哪個版本?我也看到了這個問題。 – brettb 2015-03-23 19:02:52

+0

我不記得我正在使用哪個版本,但我只檢查了當前版本,它是1.4.3。希望這有助於! – 2015-03-23 21:45:26

+0

謝謝。是的,我正在使用1.3的東西,並在前一天更新到1.4.3。沒有想過要檢查這個問題是否已經解決,而且似乎已經解決了。感謝張貼這! – brettb 2015-03-23 21:46:39