数式のグラフ化プログラム(1)

入力した数式をプロットしてグラフを表示するプログラムを作成したい。

  • 基本仕様のようなもの
    • wxPythonで実装する
    • グラフはMatplotlibで作成
    • xに関する数式を入力する
    • 表示するxの範囲を指定する
    • ボタンを押すとグラフを表示

とりあえず外枠だけできた。

  • 次にやること
    • 入力された文字列を数式として解釈する方法:かなりやっかいだ。すぐに思い付かない。
    • プロットする

ここまでのソース。PlotTool.pyw

# coding: utf-8
# -------------------------------------------------------------------
# PlotTool                               ver.0.1 (2008/12/03)
#                                               
# -------------------------------------------------------------------
import wx
import os

class MainFrame(wx.Frame):
    def __init__(self, id, title):
        width, height = 600, 700
        wx.Frame.__init__(self, id, title=u"Plot Tool",
                          size=wx.Size(width, height))
        
        self.current = "  "
        self.sb = self.CreateStatusBar(2)
        self.sb.SetStatusWidths([-1, 150])
        self.sb.SetStatusText(self.current)

        Sizer0 = wx.BoxSizer(wx.VERTICAL)
        Sizer1 = wx.BoxSizer(wx.HORIZONTAL)
        Sizer2 = wx.BoxSizer(wx.HORIZONTAL)
        
        Pan = wx.Panel(self, -1)
        StTxt1 = wx.StaticText(Pan, -1, u"数式:")
        self.TxtCtl1 = wx.TextCtrl(Pan, -1, "", size=(300,-1))
        self.TxtCtl2 = wx.TextCtrl(Pan, -1, "", size=(100,-1))
        self.TxtCtl3 = wx.TextCtrl(Pan, -1, "", size=(100,-1))
        StTxt2 = wx.StaticText(Pan, -1, u"【数式の入力例】 2.5*x^1.5+.3")
        BtnPlt = wx.Button(Pan, -1, u"数式をプロットする")
        StTxt3 = wx.StaticText(Pan, -1, u"xの表示範囲:")
        StTxt4 = wx.StaticText(Pan, -1, u"から")
        StTxt5 = wx.StaticText(Pan, -1, u"まで")

        bmp = wx.EmptyBitmap(500,500)
        self.bmpFlag = wx.StaticBitmap(Pan, -1, bmp)
        self.bmpFlag.SetBitmap(bmp)   
        
        BtnPlt.Bind(wx.EVT_BUTTON, self.OnPlot)

        Sizer1.Add(StTxt1, 0, wx.ALL, 2)
        Sizer1.Add(self.TxtCtl1, 0, wx.ALL, 2)
        Sizer1.Add(BtnPlt, 0, wx.RIGHT, 2)
        Sizer2.Add(StTxt3, 0, wx.ALL, 2)
        Sizer2.Add(self.TxtCtl2, 0, wx.ALL, 2)
        Sizer2.Add(StTxt4, 0, wx.ALL, 2)
        Sizer2.Add(self.TxtCtl3, 0, wx.ALL, 2)
        Sizer2.Add(StTxt5, 0, wx.ALL, 2)
        
        Sizer0.Add(StTxt2,  0, wx.ALL, 2)
        Sizer0.Add(Sizer1, 0, wx.ALL, 2) 
        Sizer0.Add(Sizer2,  0, wx.ALL, 2)
        Sizer0.Add(self.bmpFlag,  0, wx.ALL, 5)

        Pan.SetSizer(Sizer0)
        Sizer0.Fit(self)
        
    def OnPlot(self, event):
        klist = ['*', '/', '+', '-', '^', '(', ')']
        susiki = self.TxtCtl1.GetValue()
        if len(susiki) == 0:   # input error
            self.sb.SetStatusText(u"数式が入力されていません.")        
        else:
            slen = len(susiki)
            for i in klist:
                if susiki[0] == i:
                    print i
            path = "temp.png"
            bmp = wx.Image(path).Scale(500,500).ConvertToBitmap()
            self.bmpFlag.SetBitmap(bmp)
            self.sb.SetStatusText(u"%sが読み込まれました." % susiki)
        
        
class Application(wx.App):
    def OnInit(self):
        frame = MainFrame(None, -1)
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

def main():
    import time
    
    app = Application(0)
    print u"info> 起動時刻: %s." % time.ctime(time.time())
    appl_boot_path = os.getcwd()
    print u"info> 起動ディレクトリ: %s." % appl_boot_path
    app.MainLoop()

if __name__ == '__main__':
    main()
#eof