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の練習用に使ってみるか。