クラスを分ける

TimeFlies2.pyでは、一つのクラスの中でフレームを設定したりメソッドを定義してきた。それだと大規模なアプリケーションでは対応できないので、今のうちにクラスを分ける練習をする。

http://www.harukaze.net/~haruka/wxpython/wxpy10.html#10-1
を参考に(というかほぼそのまま)、以下TimeFlies3.pyに改造した。
特に良くなったと思うのは、フォントの設定をオブジェクトごとにやらなくてもよくなったところか。
まだまだエレガントなコードとは呼べないが、現時点ではこれが限界。

""" simple application for calculating remaining days ver.3
"""
import wx
import datetime

class MainFrame(wx.Frame):
    def __init__(self, Title):
        wx.Frame.__init__(self, None, 01, Title, size=(500,150))
        
class PutText(wx.StaticText):
    def __init__(self, parent, Text):
        wx.StaticText.__init__(self, parent, -1, Text)
        Font = wx.Font(12, wx.DECORATIVE, wx.NORMAL, wx.BOLD)
        self.SetFont(Font)

class CtrText(wx.TextCtrl):
    def __init__(self, parent, Text):
        wx.TextCtrl.__init__(self, parent, -1, Text)
        
class MyApp(wx.PySimpleApp):
    def OnInit(self):
        Frm = MainFrame("Time Flies.")
        Frm.SetBackgroundColour("green")
        
        StTxtFm = PutText(Frm, "From:")
        StTxtTo = PutText(Frm, "To:  ")
        
        StTxtY1 = PutText(Frm, "Year")
        StTxtM1 = PutText(Frm, "Month")
        StTxtD1 = PutText(Frm, "Day")
        StTxtY2 = PutText(Frm, "Year")
        StTxtM2 = PutText(Frm, "Month")
        StTxtD2 = PutText(Frm, "Day")
        
        self.TxtCtrY1 = CtrText(Frm, "2007")
        self.TxtCtrM1 = CtrText(Frm, "01")
        self.TxtCtrD1 = CtrText(Frm, "01")
        self.TxtCtrY2 = CtrText(Frm, "2007")
        self.TxtCtrM2 = CtrText(Frm, "12")
        self.TxtCtrD2 = CtrText(Frm, "31")

        Btn1 = wx.Button(Frm, -1, "Calculate!")
        
        self.StTxtRslt = PutText(Frm, "00")
        StTxtRemain    = PutText(Frm, " remain ...")
        
        GBSz = wx.GridBagSizer(5,5)
        GBSz.Add(Btn1, (0,0), (1,2), wx.FIXED_MINSIZE)
        GBSz.Add(StTxtFm, (1,0), (1,1), wx.FIXED_MINSIZE)
        GBSz.Add(StTxtY1, (1,1), (1,1), wx.FIXED_MINSIZE)
        GBSz.Add(self.TxtCtrY1, (1,2), (1,1), wx.FIXED_MINSIZE)
        GBSz.Add(StTxtM1, (1,3), (1,1), wx.FIXED_MINSIZE)
        GBSz.Add(self.TxtCtrM1, (1,4), (1,1), wx.FIXED_MINSIZE)
        GBSz.Add(StTxtD1, (1,5), (1,1), wx.FIXED_MINSIZE)
        GBSz.Add(self.TxtCtrD1, (1,6), (1,1), wx.FIXED_MINSIZE)
        GBSz.Add(StTxtTo, (2,0), (1,1), wx.FIXED_MINSIZE)
        GBSz.Add(StTxtY2, (2,1), (1,1), wx.FIXED_MINSIZE)
        GBSz.Add(self.TxtCtrY2, (2,2), (1,1), wx.FIXED_MINSIZE)
        GBSz.Add(StTxtM2, (2,3), (1,1), wx.FIXED_MINSIZE)
        GBSz.Add(self.TxtCtrM2, (2,4), (1,1), wx.FIXED_MINSIZE)
        GBSz.Add(StTxtD2, (2,5), (1,1), wx.FIXED_MINSIZE)
        GBSz.Add(self.TxtCtrD2, (2,6), (1,1), wx.FIXED_MINSIZE)
        GBSz.Add(self.StTxtRslt, (3,1), (1,3), wx.FIXED_MINSIZE)
        GBSz.Add(StTxtRemain, (3,4), (1,1), wx.FIXED_MINSIZE)

        Frm.SetSizer(GBSz)

        Btn1.Bind(wx.EVT_BUTTON, self.OnButton)
        
        Frm.Show()
        return 1

    def OnButton(self, event):
        y1 = int(self.TxtCtrY1.GetValue())
        m1 = int(self.TxtCtrM1.GetValue())
        d1 = int(self.TxtCtrD1.GetValue())
        y2 = int(self.TxtCtrY2.GetValue())
        m2 = int(self.TxtCtrM2.GetValue())
        d2 = int(self.TxtCtrD2.GetValue())
        days1 = datetime.date(y1,m1,d1)
        days2 = datetime.date(y2,m2,d2)
        self.StTxtRslt.SetLabel(str(days2-days1))
    
app = MyApp()
app.MainLoop()