2011-07-26 7 views
4

私はmatplotlibをwxPythonと協力させようとしていますが、下のアプリケーションはうまく動作しません。 (GridSizerが機能しなかったかのように)要素が重なっています。私は間違って何をしていますか?wxPythonとmatplotlibを使った単純なアプリケーションがフリーズ

更新:GridSizerをBoxSizerに変更した後は、すべてのオペレーティングシステムで両方が動作しますが、 でもGridSizerの問題は解決されません。

# wxPython module 
import wx 
# Matplotlib Figure object 
from matplotlib.figure import Figure 
# Numpy functions for image creation 
import numpy as np 

# import the WxAgg FigureCanvas object, that binds Figure to 
# WxAgg backend. In this case, this is a wxPanel 
from matplotlib.backends.backend_wxagg import \ 
FigureCanvasWxAgg as FigureCanvas 

class MyFigurePanel(wx.Panel): 
    """Class to represent a Matplotlib Figure as a wxFrame""" 
    def __init__(self, parent): 
    wx.Panel.__init__(self, parent) 
    # usual Matplotlib functions 
    self.figure = Figure()#figsize=(6, 4), dpi=100) 
    self.axes = self.figure.add_subplot(111) 
    x = np.arange(0, 6, .01) 
    y = np.sin(x**2)*np.exp(-x) 
    self.axes.plot(x, y) 
    # initialize the FigureCanvas, mapping the figure to 
    # the Wx backend 
    self.canvas = FigureCanvas(self, wx.ID_ANY, self.figure) 

class MyButtonPanel(wx.Panel): 
    def __init__(self, parent): 
    wx.Panel.__init__(self, parent) 
    save_button = wx.Button(self, label = 'SAVE se') 



class MyFrame(wx.Frame): 
    def __init__(self): 
    wx.Frame.__init__(self,None) 
    panelx = wx.Panel(self) 
    self.figure = MyFigurePanel(panelx) 
    self.buttons = MyButtonPanel(panelx) 
    grid = wx.GridSizer(1,2) 
    grid.Add(self.figure) 
    grid.Add(self.buttons) 
    panelx.SetSizer(grid) 


# Create a wrapper wxWidgets application  
app = wx.PySimpleApp() 
# instantiate the Matplotlib wxFrame 
frame = MyFrame() 
# show it 
frame.Show(True) 
# start wxWidgets mainloop 
app.MainLoop() 
+0

Pythonのバージョンは同じですか? wxpython? mathplotlib? Ubuntuの – agf

+0

は、Python 2.7.1以降、Windows 2.7.2、および両方のライブラリは同じバージョンです。 – KCH

答えて

3

これは(MyFrameを変更した後)に動作します:

from matplotlib.backends.backend_wxagg import \ 
FigureCanvasWxAgg as FigureCanvas 

class MyFigurePanel(wx.Panel): 
    """Class to represent a Matplotlib Figure as a wxFrame""" 
    def __init__(self, parent): 
    wx.Panel.__init__(self, parent) 
    self.figure = Figure()#figsize=(6, 4), dpi=100) 
    self.axes = self.figure.add_subplot(111) 
    x = np.arange(0, 6, .01) 
    y = np.sin(x**2)*np.exp(-x) 
    self.axes.plot(x, y) 
    self.canvas = FigureCanvas(self, wx.ID_ANY, self.figure) 

class MyButtonPanel(wx.Panel): 
    def __init__(self, parent): 
    wx.Panel.__init__(self, parent) 
    button = wx.Button(self, label = 'SAVE se') 

class MyFrame(wx.Frame): 
    def __init__(self): 
    wx.Frame.__init__(self, None) 
    self.figure = MyFigurePanel(self) 
    self.buttons = MyButtonPanel(self) 
    grid = wx.BoxSizer(wx.VERTICAL) 
    grid.Add(self.buttons, flag=wx.EXPAND) 
    grid.Add(self.figure, flag=wx.EXPAND) 
    self.SetSizer(grid) 
    self.Fit() 


# Create a wrapper wxWidgets application  
app = wx.PySimpleApp() 
# instantiate the Matplotlib wxFrame 
frame = MyFrame() 
# show it 
frame.Show(True) 
# start wxWidgets mainloop 
app.MainLoop() 

それを実行させるための鍵変更がMyFrameで、パネルの排除です。実際にはすでに2つのパネルを追加しています。 また、より良い外観のためにwx.BoxSizer()を使用しています(GridSizerは同じサイズのセルを生成します)

関連する問題