wxTimerの使い方

wxPythonでコードを書いていて、一定時間間隔で継続して行う処理の必要がでてきた。そのときは、タイマー機能を使うしかないのでは。Pythonのモジュールにはその機能があるらしい(http://www.python.jp/doc/2.4/lib/timer-objects.html)が、ここではwxTimerでやってみることにする。どちらも似たようなものだろうから。

  • スタートとストップの二つのボタンがある。
  • スタートを押すと、現在時刻をパネル内に表示する。
  • 1秒間隔で表示が変わる。つまり毎秒の時刻を表示する時計だな。
  • ストップを押すと時刻の表示の更新が止まる。

これを実装したのが下のコード。

import wx
import datetime

class MyApp(wx.PySimpleApp):
    def OnInit(self):
        width, height = 250, 150
        self.Frm = wx.Frame(None, -1, "wxTimer", size=wx.Size(width, height))
        VSizer = wx.BoxSizer(wx.VERTICAL)
        
        self.TxtCtl1 = wx.TextCtrl(self.Frm, -1, "", size=(235,-1),
                                   style=wx.TE_RIGHT)
        
        self.Btn1 = wx.Button(self.Frm, -1, "Start")
        self.Btn2 = wx.Button(self.Frm, -1, "Stop")
        self.Btn2.Disable()
        self.Btn1.Bind(wx.EVT_BUTTON, self.TimerStart)
        self.Btn2.Bind(wx.EVT_BUTTON, self.TimerStop)
        self.Bind(wx.EVT_TIMER, self.TimerTest)

        VSizer.Add(self.TxtCtl1, 0, wx.ALL, 2)
        VSizer.Add(self.Btn1, 0, wx.ALL, 2)
        VSizer.Add(self.Btn2, 0, wx.ALL, 2)
        self.Frm.SetSizer(VSizer)
        self.Frm.Show()
        return True
        
    def TimerStart(self, event):
        self.t1 = wx.Timer(self)
        self.t1.Start(1000)    # 数字の単位は msec
        self.Btn2.Enable()

    def TimerStop(self, event):
        self.t1.Stop()
        del self.t1                # ちゃんとdelする。
        self.Btn2.Disable()

    def TimerTest(self, event):
        now = datetime.datetime.today()
        self.TxtCtl1.SetValue("%s:%s:%s" % (now.hour, now.minute, now.second))
        
app = MyApp()
app.MainLoop()

実行結果は下図。

動きますな。