wxGridBagSizerを使用

昨日やっつけで作ったアプリTimeFlies.pyを改良する。内容はレイアウトの変更とフォントの指定(写真のように変わった)。
wxGridBagSizerを使うことで、複数の列に渡って区画を定義することができた。
だいぶ見た目はきれいになったと思う。
サイザー単独でなら、使い方が少しはわかってきたような気がする。
しかし、"Year"等の固定テキストを複数の区画で使えないものか。2回も定義するのはなかなかたいへんなのだが。

以下、改良版 TimeFlies2.py。

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

class MyApp(wx.PySimpleApp):
    def OnInit(self):
        Frm = wx.Frame(None, -1, "Time flies.", size=(500,150))
        Frm.SetBackgroundColour("yellow")
        
        StTxtFm = wx.StaticText(Frm, -1, "From:")
        StTxtTo = wx.StaticText(Frm, -1, "To:  ")
        
        StTxtY1 = wx.StaticText(Frm, -1, "Year")
        StTxtM1 = wx.StaticText(Frm, -1, "Month")
        StTxtD1 = wx.StaticText(Frm, -1, "Day")
        StTxtY2 = wx.StaticText(Frm, -1, "Year")
        StTxtM2 = wx.StaticText(Frm, -1, "Month")
        StTxtD2 = wx.StaticText(Frm, -1, "Day")
        
        self.TxtCtrY1 = wx.TextCtrl(Frm, -1, "2007")
        self.TxtCtrM1 = wx.TextCtrl(Frm, -1, "01")
        self.TxtCtrD1 = wx.TextCtrl(Frm, -1, "01")
        self.TxtCtrY2 = wx.TextCtrl(Frm, -1, "2007")
        self.TxtCtrM2 = wx.TextCtrl(Frm, -1, "12")
        self.TxtCtrD2 = wx.TextCtrl(Frm, -1, "31")

        Btn1 = wx.Button(Frm, -1, "Calculate!")
        self.StTxtRslt = wx.StaticText(Frm, -1, "00")
        StTxtRemain = wx.StaticText(Frm, -1, " remain ...")
        
        Font = wx.Font(12, wx.DECORATIVE, wx.NORMAL, wx.BOLD)
        self.StTxtRslt.SetFont(Font)
        StTxtRemain.SetFont(Font)
        StTxtFm.SetFont(Font)
        StTxtTo.SetFont(Font)
        StTxtY1.SetFont(Font)
        StTxtM1.SetFont(Font)
        StTxtD1.SetFont(Font)
        StTxtY2.SetFont(Font)
        StTxtM2.SetFont(Font)
        StTxtD2.SetFont(Font)
        
        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()

これはとりあえず完成。py2exeの練習用に使ってみるか。