数式のグラフ化プログラム(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