2013-02-26 93 views
0

我有一个简单的wxFrame和两个面板。我想要其中一个面板显示matplotlib条形图。我学会了使用图表,但我使用的show()函数在新窗口中为我提供了图表。Matplotlib条形图中的wx框架而不是新窗口

import wx 
import wx.grid as gridlib 
import os 
import Image 
import pylab as p 

class PanelOne(wx.Panel): 
    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent=parent) 
     #txt = wx.TextCtrl(self) 
     button =wx.Button(self, label="Save", pos=(200, 325)) 
     button.Bind(wx.EVT_BUTTON, parent.onSwitchPanels) 

class PanelTwo(wx.Panel): 
    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent=parent) 


     sizer = wx.BoxSizer(wx.VERTICAL) 
     self.SetSizer(sizer) 
     fig=p.figure() 
     ax=fig.add_subplot(1,1,1) 
     x=[1,2,3] 
     y=[4,6,3] 
     ax.bar(x,y) 
     p.show() 

class MyForm(wx.Frame): 

    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, 
          "Panel Switch", 
          size=(800,600)) 

     self.panel_one = PanelOne(self) 
     self.panel_two = PanelTwo(self) 
     self.panel_two.Hide() 

     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     self.sizer.Add(self.panel_one, 1, wx.EXPAND) 
     self.sizer.Add(self.panel_two, 1, wx.EXPAND) 
     self.SetSizer(self.sizer) 

     menubar = wx.MenuBar() 
     fileMenu = wx.Menu() 
     switch_panels_menu_item = fileMenu.Append(wx.ID_ANY, 
                "Switch Panels", 
                "Some text") 
     self.Bind(wx.EVT_MENU, self.onSwitchPanels, 
        switch_panels_menu_item) 
     menubar.Append(fileMenu, '&File') 
     self.SetMenuBar(menubar) 
------------------------------------------------------------------- 
    def onSwitchPanels(self, event): 

     if self.panel_one.IsShown(): 
      self.SetTitle("Panel Two Showing") 
      self.panel_one.Hide() 
      self.panel_two.Show() 
     else: 
      self.SetTitle("Panel One Showing") 
      self.panel_one.Show() 
      self.panel_two.Hide() 
     self.Layout() 

    if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyForm() 
    frame.Show() 
    app.MainLoop() 

会发生什么事,我得到了一个新的matplotlib窗口中的图表,当我关闭它,我的框架出现。我需要将图表放在框架的第二个面板中。

我试过读This,但没有完全帮助我。

回答

0

您正在使用的功能pyplotp.figure)的主要目的是照顾所有的GUI细节(它与您想要的交叉目的一起工作)。你想要的是将matplotlib嵌入你已有的gui中。有关如何操作,请参阅这些examples

此代码是从embedding_in_wx2.py拉到防止链路腐:

#!/usr/bin/env python 
""" 
An example of how to use wx or wxagg in an application with the new 
toolbar - comment out the setA_toolbar line for no toolbar 
""" 
# Used to guarantee to use at least Wx2.8 
import wxversion 
wxversion.ensureMinimal('2.8') 
from numpy import arange, sin, pi 

import matplotlib 

# uncomment the following to use wx rather than wxagg 
#matplotlib.use('WX') 
#from matplotlib.backends.backend_wx import FigureCanvasWx as FigureCanvas 

# comment out the following to use wx rather than wxagg 
matplotlib.use('WXAgg') 
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas 

from matplotlib.backends.backend_wx import NavigationToolbar2Wx 

from matplotlib.figure import Figure 
import wx 

class CanvasFrame(wx.Frame): 

    def __init__(self): 
        wx.Frame.__init__(self,None,-1, 
                         'CanvasFrame',size=(550,350)) 

        self.SetBackgroundColour(wx.NamedColour("WHITE")) 
        self.figure = Figure() 
        self.axes = self.figure.add_subplot(111) 
        t = arange(0.0,3.0,0.01) 
        s = sin(2*pi*t) 
        self.axes.plot(t,s) 
        self.canvas = FigureCanvas(self, -1, self.figure) 
        self.sizer = wx.BoxSizer(wx.VERTICAL) 
        self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW) 
        self.SetSizer(self.sizer) 
        self.Fit() 

    def OnPaint(self, event): 
        self.canvas.draw() 

class App(wx.App): 
    def OnInit(self): 
        'Create the main window and insert the custom frame' 
        frame = CanvasFrame() 
        frame.Show(True) 
        return True 

app = App(0) 
app.MainLoop() 
+0

此作品在框架上。但我正在寻找将图表嵌入其中一个面板中。和条形图。我在面板中试过你的代码,但失败了。由于无法显示条形图,我使用了pylot。 – 2013-02-26 16:07:20

+0

我无法对'失败'做任何事情。你应该用_exactly_来编辑你的问题,或者你尝试过或打开一个新的问题。要获得条形图而不是线条,只需更改'self.axes.plot(...)' - >'self.axes.bar(...)'。 – tacaswell 2013-02-26 16:41:11

+0

其实我调整了一下,并改变了情节,像你说的吧,它工作正常。谢谢。 – 2013-02-26 16:51:20