2014年1月20日月曜日

wxPython 3.0を使ってみた

wxPythonのページを見に行ったら、3.0がリリースされていました。これまで、2.8を使っていて、2.9を見送ってしまいました。さっそく、3.0をインストールして使ってみたところ、これまでのスクリプトが動かない部分もちらほら。
これまで、wx.Color()使っていたけど、wx.Colour()になったようで、エラーでとまったり。
これはすぐに修正できましたが、matplotlib1.3.1での動作がいまいち。

以下のスクリプト、python2.7 + wxPython2.8ではちゃんとmatplotlibのFigureCanvasのサイズが設定できていました。

#!/usr/bin/env python
# coding: shift_jis

import matplotlib
matplotlib.use('WXAgg')
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
import wx

class myFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'Matplotlib Test',
                style=wx.DEFAULT_FRAME_STYLE)

        self.fig = matplotlib.figure.Figure()
        ax = self.fig.add_axes([0.2, 0.2, 0.6, 0.6])
        ax.plot([0, 1], [0, 1])
      
        self.canvas = FigureCanvas(self, -1, self.fig)
        self.canvas.SetSize((1024, 600))
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.canvas, 0, wx.EXPAND|wx.ALL, 0)

        self.SetSizer(sizer)
        self.Fit()

        self.canvas.draw()

        print self.canvas.GetSize()
        print self.GetClientSize()

if __name__ == '__main__':
    app = wx.App(False)
    frame = myFrame()
    frame.Show()
    app.MainLoop()

しかし、wxPython 3.0にしたところ、サイズが変更されません。
これってwxPython 2.9からでしょうか。
しかたがないので、入れ物(FrameとかPanel)のサイズを変更する方法を使うようにしました。

#!/usr/bin/env python
# coding: shift_jis

import matplotlib
matplotlib.use('WXAgg')
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
import wx

class myFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'Matplotlib Test',
                style=wx.DEFAULT_FRAME_STYLE)

        self.fig = matplotlib.figure.Figure()
        ax = self.fig.add_axes([0.2, 0.2, 0.6, 0.6])
        ax.plot([0, 1], [0, 1])
        self.canvas = FigureCanvas(self, -1, self.fig)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.canvas, 1, wx.EXPAND|wx.ALL, 0)
        self.SetSizer(sizer)
        self.Fit()
       
        self.canvas.draw()
       
        self.SetClientSize((1024, 600))
        print self.canvas.GetSize()
        print self.GetClientSize()


if __name__ == '__main__':
    app = wx.App(False)
    frame = myFrame()
    frame.Show()
    app.MainLoop()

これまでwxPythonを使ったスクリプトは、動作を確認してそれほど多くの変更が必要ではないことが分かって一安心です。





0 件のコメント: