みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

wxPythonでアニメーション

wxPythonはクロスプラットフォームで、PythonのGUIライブラリーです。Tcl/Tk や Tkinter には伝統がありますが、あまりかっこ良くないので、wxPyhtonを使ってみます。

wx.DCを使ってアニメーションをするときのひな形。#begin drawingと#end drawingの間で、dc.Draw...()などとします。wx.Timerで一定確率で描写します。チラツキは起こらないはずです。色が変えてあるところをいじればカスタマイズできるようになっています。

以下、ソースコード。

import wx

class myWindow(wx.Window):
    def __init__(self, parent, ID):
        wx.Window.__init__(self, parent, ID, style=wx.NO_FULL_REPAINT_ON_RESIZE)
        self.SetBackgroundColour("WHITE")
        self.InitBuffer()
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.createTimer()

    def InitBuffer(self):
        size = self.GetClientSize()
        self.buffer = wx.EmptyBitmap(max(1,size.width), max(1,size.height))
        dc = wx.BufferedDC(None, self.buffer)
        dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
        dc.Clear()

    def createTimer(self):
        self.timer = wx.Timer(self)
        self.timer.Start(100)
        self.Bind(wx.EVT_TIMER, self.onTimer, self.timer)

    def onTimer(self,event):
        self.InitBuffer()
        dc = wx.BufferedDC(wx.ClientDC(self), self.buffer)
        dc.BeginDrawing()
        # begin drawing
        dc.SetPen(wx.pen("black",3,wx.SOLID))
        dc.DrawText("message",20,20)
        dc.SetPen(wx.Pen("black", 2, wx.SOLID))
        dc.DrawLine(0,self.counter*4,640,self.counter*4)
        # end drawing
        dc.EndDrawing()

    def OnPaint(self, event):
        dc = wx.BufferedPaintDC(self, self.buffer)

class myFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, -1, "myFrame", size=(800,600),
                style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE)
        mywindow = myWindow(self, -1)


if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = myFrame(None)
    frame.Show(True)
    app.MainLoop()